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