只是好奇心,我已经玩了一些原型,但似乎只允许在第一个位置使用子程序的原型&
。
写作时
sub test (&$$) {
do_something;
}
并将其命名为
test {doing_something_else} 1,2;
它有效。
当我像这样原型时
sub test ($$&) {
do_something;
}
再次将其称为
test 1,2 {doing_something_else};
它不起作用。我尝试了各种排列,但似乎没有任何表现。
我错过了什么,还是不可能?如果没有,为什么?
(我可能需要指出,我当然成功尝试了调用test(1,2,sub {foo})的选项,但它看起来并不像上面最后一个例子中的选项那样性感(为此我甚至不需要原型设计);我希望能够实现if(){} else {}等结构的语法,或者更重要的是,try()catch() {}或switch()case(){},但我想这就是为什么这些结构还没有在Perl中实现的原因)
答案 0 :(得分:8)
&
原型字符仅在原型中的第一个项目时才采用块形式。这只是对perl原型解析器工作方式的限制。
您始终可以使用sub
关键字创建一个匿名子例程,该子例程在没有原型的任何位置都可以作为参数使用。
test 1, 2, sub {doing_something_else};
如果你真的想在没有sub
的情况下编写它而不是在第一个位置,那么你可以玩Devel :: Declare来为测试子程序编写自己的解析规则(这是一个高级主题)。
答案 1 :(得分:7)
引用文档(perldoc perlsub
):
“&”需要一个匿名子程序,如果作为第一个传递 参数,不需要“sub”关键字或后续逗号。