Как правильно обрабатывать аргументы командной строки в скрипте Perl? - PullRequest
2 голосов
/ 03 августа 2011

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

script -a -p /path/to/pipe -l mail.Error -m root@email.com
script -a -l mail.Error -m root@email.com -p /path/to/pipe

and so on....

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

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

Ответы [ 3 ]

6 голосов
/ 03 августа 2011

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

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

use Getopt::Long;
## set defaults
my $path   = '/tmp';
my $log = 'm.Error';
my $email = 'test@email.com';
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 root@email.com
## and script -a -l mail.Error -m root@email.com -p /path/to/pipe
## should work now
2 голосов
/ 03 августа 2011

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

0 голосов
/ 03 августа 2011

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

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

my %opts;
GetOptions(\%opts, qw(a p=s l=s m=s)) or die;
...