选项如何在Perl的Getopt :: Long中表现?

时间:2017-09-19 14:24:25

标签: perl

我有以下一段我想要了解的代码:

use Getopt::Long;

my $isheader ;

if( !GetOptions(

    "is-header!"               => \$isheader,

  ) ) { exit 1; }

print "isheader is = $isheader\n" ;

当我将代码运行为:

script.pl  --is-header

输出结果为:

isheader is = 1

我已经放了一个“!”在选项名称is-header的末尾为否定,所以不应输出:

isheader is = 0 

其次,如果我将脚本运行为:

script.pl --is 

仍然可以打印

isheader is = 1

所以我猜Perl扩展了选项的部分名称?

第三,我跑

script.pl --is-header --is-head 

为什么它不会因模糊选项错误而失败?它打印

isheader is = 1

如果我更换is-header!在上面的代码中使用is-header +它仍会打印

isheader is = 1

虽然我猜它应该打印isheader是= 2,为什么会这样?

我读了https://perldoc.perl.org/Getopt/Long.html并正在尝试理解它,但似乎我搞砸了。

2 个答案:

答案 0 :(得分:4)

  

我已经放了一个“!”在选项名称末尾is-header否定

实际上,如果您阅读the documentation,就会说:

  

带有感叹号的可忽略选项!在选项名称

之后

“可否定”与“否定”不同。

可否定意味着您可以通过在选项名称前添加“否”来关闭该选项。

script.pl --is_header

script.pl --nois_header

答案 1 :(得分:2)

Getopt :: Long支持各种参数类型。 foo!声明带有布尔值的--foo选项,而foo=s则指望字符串值。在这种情况下,!不是否定。如果您希望每次指定选项时增加一个值,请使用+类型foo+。有关详细信息,请阅读Summary of Option Specifications

默认情况下,Getopt :: Long将允许缩写参数名称,只要缩写是明确的。因此,如果您有--house--home,则--hou--hom都会被识别,但不会被--ho识别。您可以使用auto_abbrev配置标志显式启用或禁用此行为。有关所有配置选项,请参阅Configuring Getopt::Long。您可以使用Getopt::Long::Configure()功能设置它们。

Getopt :: Long是一个非常复杂的模块,有很多配置选项。无论你想做什么,你都可以配置它,但我个人更喜欢避免这种复杂性和繁琐的界面。在简单的情况下(例如没有参数的选项),手工解析参数并不困难。