我有以下一段我想要了解的代码:
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
并正在尝试理解它,但似乎我搞砸了。
答案 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是一个非常复杂的模块,有很多配置选项。无论你想做什么,你都可以配置它,但我个人更喜欢避免这种复杂性和繁琐的界面。在简单的情况下(例如没有参数的选项),手工解析参数并不困难。