Perl中的函数调用和goto&NAME有什么区别?

Gan*_*thy 5 perl goto function-call

我正在阅读非常有趣的Perl.但是在Perl中从这里读到goto的时候我有一个疑问.

我知道goto语句有三种类型.

标签LABEL.

转到EXPR.

转到和NAME.

但在这三种类型中,第三种类型的用途是goto &NAME什么?这似乎也像一个函数调用.然后,

  1. Perl goto &NAME和普通之间的真正区别是什么function call
  2. 在使用goto&NAME的时候?

任何人都可以用例子解释.

提前致谢.

zdi*_*dim 11

它在goto页面中说

goto &NAME形式是从其他形式的完全不同 goto.事实上,它根本不是正常意义上的结果,并且没有与其他结果相关的耻辱感.

然后按照你的问题的答案

相反,它退出当前子例程(丢失所设置的任何更改local())并立即使用当前值调用命名子例程@_.

通过正常的函数调用,函数退出后,下一行继续执行.

该段的其余部分也值得一读,并回答你的第二个问题

这是由AUTOLOAD希望加载另一个子程序然后假装其他子程序首先被调用的子程序使用的(除了@_当前子程序中的任何修改都传播到另一个子程序.)之后goto,甚至caller不会能够说出这个例程首先被调用了.


一个基本的例子.在deeper某处定义子程序,比较

sub func_top {
    deeper( @_ );  # pass its own arguments

    # The rest of the code here runs after deeper() returns
}
Run Code Online (Sandbox Code Playgroud)

sub func_top {        
    goto &deeper;  # @_ is passed to it, as it is at this point

    # Control never returns here  
}
Run Code Online (Sandbox Code Playgroud)

在声明中goto &deeper,子func_top退出.所以在deeper完成之后,控制返回到func_top调用之后.从某种意义上说,func_top被替换为deeper.

尝试传递带有goto &func错误结果的参数,即使只是为了goto &deeper().