История вопроса:
С самых ранних версий Perl переменная @ARGV предоставляла список аргументов командной строки. Однако Parse вручную легко приводил к ошибкам. Для улучшения читаемости и гибкости появился модуль Getopt::Std, позднее — Getopt::Long и внешние CPAN-модули (например, MooX::Options, Getopt::Euclid).
Проблема:
«Ручной» парсинг зачастую не учитывает отрицательные числа, обязательные и множественные флаги, параметры с пробелами. Разные форматы синтаксиса (--flag=value, -abc, смешанные позиции) могут делать скрипт недружелюбным и легко ломающимся при изменении порядка аргументов.
Решение:
Использовать Getopt::Long для продвинутого парсинга опций и флагов. Он поддерживает длинные/короткие опции, автообнаружение вариантов, массивы, хэши и различные форматы флагов. Для очень сложных CLI- интерфейсов применяют CPAN-модули с декларативным описанием параметров (MooX::Options, MooseX::Getopt).
Пример кода:
use Getopt::Long; my $verbose = 0; my $count = 0; my @files; GetOptions( "verbose" => \$verbose, "count=i" => \$count, "file=s" => \@files, ); print "Verbose is $verbose Count is $count Files: @files ";
Ключевые особенности:
Как отличить позиционные аргументы от опциональных, если используется только Getopt::Std?
Getopt::Std не умеет работать с длинными именованными опциями или автоматически отделять позиционные аргументы. После парсинга коротких флагов позиционные доступны в @ARGV, но поддержка сложного синтаксиса требует ручной работы.
В чём главное отличие между Getopt::Long и Getopt::Std?
Getopt::Std работает только с короткими (односимвольными) опциями, а Getopt::Long умеет парсить длинные флаги, типы значений, массивы/хэши и поддерживает небуквенные ключи.
Можно ли принимать параметры через STDIN, а не только через @ARGV?
Да, но это не стандарт для Getopt::Long. Для смешанных CLI- и STDIN-вводов вам нужно вручную читать STDIN и интегрировать этот ввод в свою логику парсинга.
Скрипт вручную парсит каждый аргумент из @ARGV через цикл, забывая про значения после --arg, работу с -- и ошибочную обработку отрицательных чисел (например, -5 становится флагом).
Плюсы:
Минусы:
Использование Getopt::Long c коротким описанием всех переменных в начале файла. Поддерживаются массивы, обязательность, проверка формата, вывод справки.
Плюсы:
Минусы: