Как я могу разобрать ключи командной строки в Perl? - PullRequest
4 голосов
/ 03 февраля 2009

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

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

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

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

Ответы [ 4 ]

21 голосов
/ 03 февраля 2009

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

4 голосов
/ 03 февраля 2009
use Getopt::Std;

our $opt_r; # will be set to its value if used.
getopts('r:'); # -r has an option.
1 голос
/ 03 февраля 2009
  • Добавьте ключ -d для вашего каталога. Мое мнение таково: «Если команда является необязательной, она должна иметь переключатель для ее включения».
  • Также я бы удалил переключатели (и их аргументы) из массива, когда я их читаю, оставив только мое «выражение». Если в этом массиве более 1 элемента, кто-то написал что-то не так.
0 голосов
/ 11 февраля 2009

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

Удачи,:)

...