2016-09-07 5 views
3

Есть ли способ принудительно использовать -flags при чтении в аргументах командной строки с использованием Getopt :: Long? Например, в моей нынешней ситуации:Использование флагов Getopt :: Long

GetOptions('r=s' => \$var1, 
       'lf=f' => \$var2, 
       'uf=f' => \$var3, 
       'trd=i' => \$var4, 
       'vd=f' => \$var5) 
or die("$usage"); 

Сценарий не выходит или дисплей $ использование, если аргументы все еще предоставляются, но без флагов (например, -Если). Вместо этого он запускается независимо от того, когда это неизбежно приведет к ошибкам позже, поскольку аргументы не были прочитаны в их соответствующие переменные (и могут быть в неправильном порядке).

+0

Непонятно, что вы подразумеваете под «флагами». если вы запустите свой код выше с помощью только '-lf' в качестве опции, то« GetOptions »вернет статус ошибки. Вы хотите, чтобы некоторые из параметров были обязательными? – Borodin

+0

@Borodin По флагам я имею в виду -lf, -uf, -trd и -vd. Я могу запустить скрипт без ложного результата: script.pl arg1 arg2 arg3 arg4. Я ожидал, что это не сработает, поскольку это не было предоставлено: script.pl -lf arg1 -uf arg2 -trd arg3 -vd arg4. – AnnaSchumann

ответ

4

Q: GetOptions не возвращает ложный результат, если опция не входит в комплект

A: Вот почему они называются 'варианты'.

Источник: Getopt::Long documentation

Вы можете добавить условные проверить значение флагов, и если они не определены, то называют die или позвоните usage.

1

Getopt::Long будет искать все параметры командной строки, которые вы указываете в вызове GetOptions. Ни один из них не требуется, но индивидуальный вариант может потребоваться иметь значение определенного типа, и GetOptions возвратит ложное состояния, если значение отсутствует или имеет неправильный тип

Есть варианты и их значение удаляются из командной строки, и все, что осталось, передается программе через @ARGV как обычно

Большинство программ не требуют всех возможных параметров, которые необходимо предоставить в командной строке, поэтому, если вы хотите настаивать что все они указаны, то вы можете просто протестировать их с помощью

use List::Util 'all'; 

die $usage unless all { defined } $var1, $var2, $var3, $var4, $var5; 

Вы также можете требовать, что нет никакого ввода, который не указан в качестве одного из вариантов, в этом случае вы можете просто проверить @ARGV

die $usage if @ARGV; 
0

Просто проверьте позже.

use File::Basename qw(basename); 

sub help { 
    print(...); 
    exit(0); 
} 

sub usage { 
    if (@_) { 
     my ($msg) = @_; 
     chomp($msg); 
     warn("$msg\n"); 
    } 

    my $prog_name = basename($0); 

    warn("Use $prog_name --help for more information\n"); 
    exit(1); 
} 

my ($var1, $var2, $var3, $var4, $var5); 

GetOptions(
    'help|h|?' => \&help, 
    'r=s'  => \$var1, 
    'lf=f'  => \$var2, 
    'uf=f'  => \$var3, 
    'trd=i' => \$var4, 
    'vd=f'  => \$var5 
) 
    or usage(); 

defined($var2) 
    or usage("-lf must be provided"); 
Смежные вопросы