2016-09-07 60 views
3

在使用Getopt :: Long读取命令行参数时,是否有强制使用-flags的方法?例如,在我目前的状况:强制使用标志Getopt :: Long

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

脚本不会退出或显示$使用,如果仍然提供的参数,但没有标志(如-LF)。相反,它会一直运行,直到之后不可避免的错误,因为参数没有被读入它们各自的变量(并且很可能是错误的顺序)。

+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

问:这就是为什么他们是所谓的“选择”:当选择不提供

一个 GetOptions不返回错误的结果。

来源: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"); 
相关问题