goto LABEL
形式會尋找標記為 LABEL 的陳述式並在那裡繼續執行。它無法用於跳出給予 sort
的區塊或子常式。它可以用於跳到動態範圍內的其他任何地方,包括跳出子常式,但通常最好使用其他建構,例如 last
或 die
。Perl 的作者從未覺得有必要使用這種形式的 goto
(在 Perl 中,C 是另一回事)。(不同之處在於 C 不提供命名迴圈與迴圈控制的組合。Perl 提供,這取代了其他語言中 goto
的大多數結構化用途。)
goto EXPR
形式預期將 EXPR
評估為程式碼參考或標籤名稱。如果它評估為程式碼參考,它將會像下面 goto &NAME
那樣處理。這對於透過 goto __SUB__
實作尾遞迴特別有用。
如果表達式評估為標籤名稱,它的範圍將動態解析。這允許根據 FORTRAN 進行計算的 goto
,但如果您要針對可維護性進行最佳化,則不建議這樣做
goto ("FOO", "BAR", "GLARCH")[$i];
如本範例所示,goto EXPR
豁免於「看起來像函式」的規則。它後面的一對括號不(一定)界定其引數。goto("NE")."XT"
等於 goto NEXT
。此外,與大多數命名運算子不同,它具有與賦值相同的優先順序。
使用 goto LABEL
或 goto EXPR
跳轉到建構中已不建議,且會發出警告。即使如此,它仍不能用於進入需要初始化的任何建構,例如子常式、foreach
迴圈或 given
區塊。一般來說,它不能用於跳轉到二元或清單運算子的參數,但可以用於跳轉到二元運算子的第一個參數。(=
指定運算子的「第一個」運算元是其右運算元。)它也不能用於進入已最佳化的建構。
goto &NAME
形式與 goto
的其他形式相當不同。事實上,它根本不是一般意義上的 goto,也沒有與其他 goto 相關的負面意涵。相反地,它會結束目前的子常式(失去 local
設定的任何變更),並立即使用 @_
的目前值呼叫指定的子常式。這是 AUTOLOAD
子常式用來載入另一個子常式,然後假裝該子常式一開始就被呼叫(但目前子常式對 @_
的任何修改會傳播到另一個子常式)。在 goto
之後,甚至連 caller
都無法得知這個常式是先被呼叫的。
NAME 不必是子常式的名稱;它可以是包含程式碼參考或評估為程式碼參考的區塊的純量變數。