Как правильно обрабатывать аргументы командной строки в сценарии Perl?

Я пытаюсь создать скрипт/приложение, которое при запуске принимает аргументы командной строки. Конечно, это повседневная работа, но, поскольку я делаю это впервые, мне нужно руководство. Допустим, мой скрипт может принимать такие аргументы командной строки:

script -a -p /path/to/pipe -l mail.Error -m [email protected]
script -a -l mail.Error -m [email protected] -p /path/to/pipe

and so on....

Из-за гибкого характера сценариев командной строки аргументы, которые вы можете передать ему, могут быть в разном порядке и могут отсутствовать или иметь недопустимые аргументы. Теперь я знаю, что это можно решить, очень строго определяя, как должны отображаться аргументы (сначала -a, затем -p с путем, затем -l с средством/приоритетом журнала и, наконец, -m с действительным адресом электронной почты) и путем тестирования всех возможных появления их.

Но должен быть лучший способ. Это невероятно неэффективно (для меня), и мне было интересно, есть ли лучший способ сделать что-то. Я хочу оставаться максимально гибким и просто заставить все работать, а не сосредотачиваться на строгом использовании.


person n0pe    schedule 03.08.2011    source источник


Ответы (3)


Я использую Getopt::Long в качестве аргументов.

Непроверенный пример:

use Getopt::Long;
## set defaults
my $path   = '/tmp';
my $log = 'm.Error';
my $email = '[email protected]';
my $a = 0;
my $result = GetOptions ("path=s"  => \$path,
                         "log=s"   => \$log,
                         "a"       => \$a,
                         "email=s" => \$email);
## both script -a -p /path/to/pipe -l mail.Error -m [email protected]
## and script -a -l mail.Error -m [email protected] -p /path/to/pipe
## should work now
person gpojd    schedule 03.08.2011
comment
Вы также можете передать GetOptions ссылку на хэш, и вся информация будет сохранена в хеше. Например, учитывая GetOptions(\%opt, "path=s", "log=s"), пройдя -path /tmp, вы получите $opt{path} == "/tmp". Я считаю удобным, чтобы информация из параметров командной строки была легко видна в коде. - person Keith Thompson; 03.08.2011

Используйте Getopt::Std, если вам нужны только 1-символьные параметры, Getopt::Long, если вы хотите поддерживать более длинные имена аргументов.

person Keith Thompson    schedule 03.08.2011
comment
Просто всегда используйте Getopt::Long — он может обрабатывать и то, и другое. - person tchrist; 03.08.2011
comment
Да, но Getopt::Std упрощает объединение, например, обрабатывает -abc как -a -b -c (за счет отсутствия передачи длинных опций). Лично я не пользуюсь пакетированием и не пользовался Getopt::Std годами. Чтобы узнать подробности, perldoc Getopt::Long и прочтите раздел «Комплектование» (есть несколько вариантов конфигурации). - person Keith Thompson; 03.08.2011

Getopt::Long может автоматически преобразовать вашу командную строку в хэш-переменную. Порядок в командной строке не имеет значения. Вы можете проверить, заданы ли параметры или нет, проверив хеш-ключи.

use warnings;
use strict;
use Getopt::Long;

my %opts;
GetOptions(\%opts, qw(a p=s l=s m=s)) or die;
person toolic    schedule 03.08.2011