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,是否值得修复?
这感觉像是一个错误,但是您期望发生什么?
多玩一点 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] 不存在。
| 归档时间: |
|
| 查看次数: |
459 次 |
| 最近记录: |