这是Perl的glob原型的错误吗?

Eri*_*rom 16 syntax perl prototype

没有特别的原因,我正在使用glob原型(*),看看当参数是一个已定义的子程序时它会做什么.

给出以下代码:

sub test (*) {print "[@_]\n"}
sub blah ($) {"blah got @_"}
Run Code Online (Sandbox Code Playgroud)

如果你写,test blah;你会得到语法错误Not enough arguments for main::blah...

如果你编写test blah 1;程序编译并打印[blah]

如果你编写test blah die;程序编译,打印[blah]并且不会死.

如果你编写test blah(1);程序编译并打印[blah got 1]

如果你编写test blah(die);程序编译然后死亡.

最后两个例子显然是"如果它看起来像一个子程序调用它是一个子程序调用"规则的应用.

但是,没有括号的例子对我来说似乎是个错误.因为似乎正在发生的事情是,尽管处于glob上下文中,解析器仍然将其blah视为需要参数的原型函数.但是当编译完成后,参数将blah被完全抛弃,而字符串'blah'则被传递给test.

以下是test blah die;构造运行的示例B::Deparse:

$ perl -MO=Deparse,-p -e 'sub test (*) {print "[@_]\n"} sub blah ($) {"blah got @_"} test blah die;'
sub test (*) {
    print("[@_]\n");
}
sub blah ($) {
    "blah got @_";
}
&test('blah');
-e syntax OK
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,die它完全从op-tree中删除.

所以我的问题是,如果其他人认为这种行为是个错误?行为记录在任何地方吗?如果是一个bug,是否值得修复?

itj*_*itj 0

这感觉像是一个错误,但是您期望发生什么?

多玩一点 Perl 后,我发现确实使用了某种扭曲的智能。

test blah 1 2 
Run Code Online (Sandbox Code Playgroud)

失败是因为 2 被视为无关紧要。

因此,“blah 1”通过了对具有 1 个参数的函数的检查,但随后 glob 处理不会检测到这一点。使用标量原型确实可以达到您的预期。

sub test (*) {print "[@_]\n"} 

==> blah got 1
Run Code Online (Sandbox Code Playgroud)

我还检查了是否还有更多参数......

sub test(*) { print "[$_[0] $_[1]]\n" }
Run Code Online (Sandbox Code Playgroud)

炸弹,因为 $_[1] 不存在。