我正在阅读非常有趣的Perl。但是在Perl中阅读goto from here时,我有一个疑问。
我知道goto语句有三种类型。
转到LABEL。
转到EXPR。
goto& NAME。
但在这三种类型中,第三种goto &NAME
的用途是什么?
这似乎也像一个函数调用。
然后,
goto &NAME
和普通function call
之间的真正区别是什么?任何人都可以用例子解释。
提前致谢。
答案 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()
。