【发布时间】:2011-01-06 12:05:03
【问题描述】:
我正在使用 Getopt::Lucid 处理 CLO,但遇到了一个有趣且意想不到的问题。以下代码:
push @clo_spec, map { Switch($_) } qw(-c -m -s -p),
map { Switch($_) } qw(--help --man --usage --version),
map { Switch($_) } qw(--debug --verbose),
map { Param($_) } keys %$rc_spec_ref
;
my $clo_o = Getopt::Lucid->getopt(\@clo_spec);
产生以下错误:
'Getopt::Lucid::Spec=HASH(0x9383847)' is not a valid option name/alias
现在,Getopt::Lucid 通过引用表示有效选项的字符串表达式进行配置,然后将这些字符串传递给返回祝福哈希的六个子例程之一。每个子程序代表一种选项;开关、计数器、参数、列表或密钥对。
有趣的是,如果去掉任意三个地图表达式,
push @clo_spec, #map { Switch($_) } qw(-c -m -s -p),
map { Switch($_) } qw(--help --man --usage --version),
#map { Switch($_) } qw(--debug --verbose),
#map { Param($_) } keys %$rc_spec_ref
;
然后一切正常。更有趣的部分是,如果您将每个地图表达式括在括号中,一切都可以正常工作:
push @clo_spec, (map { Switch($_) } qw(-c -m -s -p)),
(map { Switch($_) } qw(--help --man --usage --version)),
(map { Switch($_) } qw(--debug --verbose)),
(map { Param($_) } keys %$rc_spec_ref)
;
以上内容让我相信这个问题与 Getopt::Lucid 中的错误无关。此外,我在查看 map 函数的参考后考虑了上述修复,其中提到有时 map 可能会与逗号混淆。 perl会展平嵌入的列表,而周围的括号似乎有勾勒每个map表达式的作用,但我真的不明白这是怎么回事。
谁能解释一下?
【问题讨论】:
-
如果只将 map 函数的输入(即 qw 列表等)放在括号中会发生什么?那它会起作用吗?如果是这样,我认为发生的事情是第一张地图假设“(qw(-c -m -s -p),(map { Switch($_)}(qw(--help --man --usage --version), (map { Switch($_) } (qw(--debug --verbose), (map { Param($_) } (keys (%$rc_spec_ref)))))))" 是它的输入。你明白我在说什么吗?基本上每个地图的列表上下文输入似乎都被贪婪地解析了。
-
它不起作用,因为(正如下面的答案所解释的那样)后续地图的输出将被添加到以前地图的输入中。贪婪输入是一种很好的思考方式。