Как установить значения по умолчанию с помощью Getopt::Std?

Я пытаюсь получить значения из командной строки, используя Getopt::Std в своем Perl-скрипте. .

use Getopt::Std;
$Getopt::Std::STANDARD_HELP_VERSION = 1;
getopts('i:o:p:');
my $inputfile = our $opt_i;
my $outputfile = our $opt_o;
my $parameter_value = our $opt_p;

Здесь первые две переменные ($inputfile,$outputfile) являются обязательными, но последняя переменная ($parameter_value) является необязательной и может быть проигнорирована.

Я пытаюсь установить какое-то значение по умолчанию для последней переменной ($parameter_value), когда флаг -p игнорируется в командной строке.

Я пытался использовать это:

my $parameter_value = our $opt_p || "20";

Здесь он передает правильное значение, когда флаг -p игнорируется в командной строке. Но проблема в том, что когда я предоставляю какое-то значение из командной строки (например, -p 58), в программу передается то же значение 20 вместо 58, которое я передал из командной строки.

Не могли бы вы помочь мне, указав на ошибки, которые я здесь делаю?

Спасибо.


person Suren    schedule 22.10.2009    source источник


Ответы (3)


Лучше всего использовать Getopt::Long и использовать хэш вместо отдельных переменных. . Затем вы можете передать значения по умолчанию, предварительно заполнив массив

    use Getopt::Long;
    my %opts = (parameter => 20);
    GetOptions( \%opts, 
            'p|parameter=i', 
            'o|outputfile=s',
            'i|inputfile=s'
    ) or die "Invalid parameters!";

    # I didn't bother cloning STANDARD_HELP_VERSION = 1;
person DVK    schedule 22.10.2009

Я предлагаю установить переменные opt в значения по умолчанию до вызова getopts. Кроме того, вы можете использовать переменные $opt_ в своем сообщении об использовании, чтобы показать значения по умолчанию.

use Getopt::Std;
$Getopt::Std::STANDARD_HELP_VERSION = 1;
our $opt_p = 20;
sub HELP_MESSAGE { print " -p  parameter value (default $opt_p)\n"; }
getopts('i:o:p:');
my $inputfile = our $opt_i;
my $outputfile = our $opt_o;
my $parameter_value = our $opt_p;
person brianegge    schedule 08.08.2013
comment
Или просто используйте $opt_i всякий раз, когда вам это нужно. Тогда понятно, что это параметр. - person Otheus; 22.01.2016

person    schedule
comment
спасибо Синан, это работает очень хорошо и сохраняет формат моей кодировки. Большое спасибо. - person Suren; 22.10.2009
comment
Если вы используете 5.10+, было бы лучше использовать // вместо ||, потому что последний проверяет истинность, а не определенность. Это не позволит вам передать ложные значения (например, 0). Длинный способ получить эквивалентное поведение до 5.10 — это $x = defined $y ? $y : Z, где Z — значение по умолчанию. - person Michael Carman; 23.10.2009
comment
@Майкл Карман Думаю, я предположил, что 0 не является допустимым значением. - person Sinan Ünür; 23.10.2009
comment
Итак, я так понимаю, возникла проблема с использованием our в самом операторе присваивания, и его предварительное использование исправляет это? Не могли бы вы рассказать, в чем разница между вашим кодом и кодом Сурена? - person Rob Kennedy; 23.10.2009
comment
@Rob Kennedy С точки зрения опубликованного кода размещение our не имеет значения. Все, что я могу сделать, это то, что в его strict-бесплатном, warnings-свободном коде происходит что-то еще, из-за чего последний our находится в рамках другого пакета, отличного от того, который установлен getopts. - person Sinan Ünür; 23.10.2009