【问题标题】:What is the difference between function call and goto &NAME in Perl?Perl 中的函数调用和 goto &NAME 有什么区别?
【发布时间】:2016-11-21 06:57:33
【问题描述】:

我正在阅读 Perl,这很有趣。但是在 Perl 中阅读 goto from here 时,我产生了疑问。

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

转到标签。

转到 EXPR。

转到 &NAME。

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

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

谁能举例说明一下。

提前致谢。

【问题讨论】:

    标签: perl goto function-call


    【解决方案1】:

    它在goto 页面中显示

    goto &NAME 形式与其他形式有很大不同 goto。事实上,它根本不是正常意义上的 goto,而且 没有与其他 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_topdeeper 取代了。

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

    【讨论】:

    • @Ganapathy 我添加了一个基本示例——这有帮助吗?
    • 谢谢你的例子,从你的例子我很容易理解
    • @Ganapathy 请考虑接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多