2016-11-21 111 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

相關問題