2016-11-21 107 views
5

我正在阅读Perl,这很有趣。但是,在阅读Perl中的goto from here时,我有些怀疑。函数调用和goto&NAME在Perl中有什么区别?

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

goto LABEL。

goto EXPR。

goto & NAME。

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

  1. 是什么goto &NAME并在Perl正常function call的真正区别?
  2. 当我们使用转到& NAME?

任何人都可以请示例解释。

在此先感谢。

回答

10

它说,在goto

goto &NAME形式从其他形式的 goto很大的不同。事实上,它根本不是一般意义上的转向,并且 没有与其他gotos相关联的耻辱感。

然后遵循回答你的问题

相反,它 退出当前子程序(损失以local()设置的任何改变) 并立即在其位置调用使用 电流值命名的子程序的@_

对于正常的函数调用,在函数退出后继续执行下一行。

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

这是用来由希望加载另一个子例程,然后假装其他子程序被称为AUTOLOAD子程序第一个地方(除了在当前子程序中对@_进行的任何修改都会传播到另一个子程序中。)在goto之后,甚至不是caller都能够说明此例程是先调用的。


一个基本的例子。随着子程序deeper某处定义,

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

    # Control never returns here 
} 

比较

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

    # The rest of the code here runs after deeper() returns 
} 

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

试图通过goto &func传递参数会导致错误,即使只是为goto &deeper()

+0

你能举个例子吗? – Ganapathy

+0

@Ganapathy我添加了一个基本的例子 - 这有帮助吗? – zdim

+0

感谢您的示例,我很容易从您的示例 – Ganapathy

相关问题