2009-02-03 2 views
4

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

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

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

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

+0

Я бы выбрал другой ответ. –

+0

@Brad: Уточните? – aks

+0

Ну, принятый ответ на самом деле не отвечает на заданный вопрос. –

ответ

21

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

+0

http://search.cpan.org/perldoc?Getopt::Long –

+0

Эта ссылка более актуальна или отличается значительным образом? – dsm

+0

@dsm: «perldoc?» ссылка лучше, потому что она возвращает последнюю версию. Здесь было сказано: http://stackoverflow.com/questions/43758/how-should-i-link-to-cpan-modules-in-answers – sebthebert

1
  • Добавить ключ -d для вашего каталога. Мое мнение гласит: «Если команда является необязательной, у нее должен быть переключатель, чтобы включить ее».
  • Также я удалял переключатели (и их аргументы) из массива, когда читал их, оставляя только свое «выражение». Если в этом массиве есть более одного элемента, кто-то написал что-то неправильно.
+0

Как бы вы удалили элементы из массива? Используйте «shift» для прохождения и обработки аргументов или чего-то еще? – aks

+0

, так как я хочу быть как можно свободнее передвигаться как можно скорее, я бы, вероятно, использовал сращивание. http://perldoc.perl.org/functions/splice.html Это может быть очень полезно. my $ switch = сращивание (@ARGV, $ offset, 1); –

+0

Большое спасибо, сращивание - именно то, что я искал. – aks

4
use Getopt::Std; 

our $opt_r; # will be set to its value if used. 
getopts('r:'); # -r has an option. 
0

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

Удачи, :)

 Смежные вопросы

  • Нет связанных вопросов^_^