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

时间:2016-11-21 06:57:33

标签: perl goto function-call

我正在阅读非常有趣的Perl。但是在Perl中阅读goto from here时,我有一个疑问。

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

  

转到LABEL。

     

转到EXPR。

     

goto& NAME。

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

  1. Perl中goto &NAME和普通function call之间的真正区别是什么?
  2. 当我们使用goto& NAME?
  3. 任何人都可以用例子解释。

    提前致谢。

1 个答案:

答案 0 :(得分:10)

它在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
}

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

    # Control never returns here  
}

goto &deeper语句处退出子func_top。因此,在deeper完成后,控件将在func_top调用之后返回。 从某种意义上说,func_top已替换为deeper

尝试使用goto &func传递参数会导致错误,即使只是goto &deeper()