是否可以将子程序原型化为$$&in perl?

yog*_*mbi 2 perl prototype

只是一个好奇心,我已经玩了一些原型,但看起来&子程序的原型只允许在第一个位置.

当我写作

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中实现的原因)

Eri*_*rom 8

所述&原型字符只在该块的形式时,它是在一个原型中的第一项.这只是perl原型解析器工作方式的限制.

您始终可以使用sub关键字创建一个匿名子例程,该子例程在没有原型的任何位置都可以作为参数使用.

test 1, 2, sub {doing_something_else};
Run Code Online (Sandbox Code Playgroud)

如果你真的想要在没有sub但不在第一个位置的情况下编写它,你可以玩Devel :: Declare来为测试子程序编写自己的解析规则(这是一个高级主题).


cho*_*oba 7

引用文档(perldoc perlsub):

"&"需要一个匿名子例程,如果作为第一个 参数传递,则不需要"sub"关键字或后续逗号.