Как я могу анализировать переключатели командной строки в Perl?

Чтобы расширить мой эмулятор "grep" в Perl, я добавил поддержку -r переключатель, который включает рекурсивный поиск в подкаталогах. Теперь вызов командной строки выглядит примерно так:

perl pgrep.pl -r <directory> <expression>

Аргументы -r и directory являются необязательными (по умолчанию для каталога используется '.'). На данный момент я просто проверяю, является ли первый аргумент -r, и если да, то устанавливаю соответствующий флаг и сканирую оставшиеся два аргумента, используя операцию сдвига. Очевидно, это было бы проблемой, если бы -r появлялось в конце списка аргументов или, что еще хуже, между именем каталога и поисковым выражением.

Одним из обходных путей было бы просто удалить элемент -r из массива @ARGV, чтобы я мог просто переместить - в оставшиеся аргументы, но я не могу найти способ сделать это без получения ' undef' в нечетной позиции в моем массиве. Любые предложения или различные стратегии, которые вы могли использовать, приветствуются.


person aks    schedule 03.02.2009    source источник
comment
Я бы выбрал другой ответ.   -  person Brad Gilbert    schedule 21.07.2009
comment
Ну, принятый ответ на самом деле не отвечает на заданный вопрос.   -  person brian d foy    schedule 18.01.2010


Ответы (3)


Вы должны использовать GetOpt::Long. Это сделает все, что вам нужно, как описано.

person dsm    schedule 03.02.2009
comment
Эта ссылка более актуальна или существенно отличается? - person dsm; 04.02.2009
comment
@dsm: перлдок? ссылка лучше, потому что она возвращает последнюю версию. Это обсуждалось здесь: stackoverflow.com/questions/43758/ - person sebthebert; 04.02.2009

  • Добавьте переключатель -d для вашего каталога. Мое мнение таково: «если команда необязательна, у нее должен быть переключатель для ее включения».
  • Также я бы удалил переключатели (и их аргументы) из массива по мере их чтения, оставив только свое «выражение». Если в этом массиве более 1 элемента, кто-то написал что-то не так.
person J.J.    schedule 03.02.2009
comment
Как бы вы удалили элементы из массива? Использовать «сдвиг», чтобы пройти и обработать аргументы или что-то еще? - person aks; 03.02.2009
comment
так как я хочу быть как можно более свободным в передвижении, я бы, вероятно, использовал сращивание. perldoc.perl.org/functions/splice.html Это может быть чрезвычайно полезно. мой $switch = splice(@ARGV, $offset, 1); - person J.J.; 03.02.2009
comment
Большое спасибо, splice - это именно то, что я искал. - person aks; 04.02.2009

В моей главе "Конфигурация" в Mastering Perl рассматривается несколько возможностей обработки переключателей командной строки, от perl -s к популярным модулям для их обработки. В вашем примере я бы, вероятно, начал с Getopt::Std и преобразовал в Getopt::Long, если мне это понадобится позже.

Удачи, :)

person brian d foy    schedule 11.02.2009