此雜湊包含當呼叫難以或無法包裝的各種 perl 關鍵字時所呼叫的程式碼參考。此雜湊的鍵以正在掛鉤的關鍵字命名,後接兩個底線,然後是階段術語;「before」或「after」。
如果您嘗試修改未記錄存在的鍵,或嘗試在雜湊中儲存程式碼參考或未定義以外的任何內容,Perl 將會擲回錯誤。如果您希望使用物件來實作掛鉤,您可以使用 currying 將物件嵌入匿名程式碼參考中。
目前只有一個關鍵字可以掛鉤,require
,但預期在未來的版本中將會有更多支援掛鉤的關鍵字。
${^HOOK}{require__before}
指示的常式由 require
在檢查 %INC
、查詢 @INC
、呼叫 INC 掛鉤或編譯任何程式碼之前呼叫。它會以單一引數呼叫,即正在要求的項目之檔名(套件名稱會轉換為路徑)。它可能會變更此檔名以變更載入的檔案。如果掛鉤在執行期間發生錯誤,它將會阻止 require 執行。
為了讓在 require 關鍵字執行之前和之後都能使用共用狀態執行動作,require__before
掛鉤可能會傳回一個「後續動作」程式碼參考,而這個程式碼參考將會在 require
完成時執行。這個程式碼參考會在不論 require 是否成功完成或擲回例外的情況下執行。它會以已要求的檔名呼叫。您可以檢查 %INC 以確定 require 是否成功。require__before
掛鉤的任何其他傳回值都將會被靜默忽略。
require__before
鉤子會以先進先出的順序呼叫,如果鉤子傳回一個程式碼參考,這些程式碼參考會以先進後出的順序呼叫。換句話說,如果 A 需要 B,而 B 需要 C,則 require__before
會先對 A 呼叫,然後是 B,最後是 C,而後續動作的程式碼參考會先對 C 執行,然後是 B,最後才是 A。
良好的程式碼應確保在設定 require__before
鉤子時,會呼叫任何先前安裝的鉤子,而且如果它們的傳回值是程式碼參考,也會呼叫它們。請參閱 perlfunc 中的「require」 以取得範例實作。
${^HOOK}{require__after}
指示的常式會在 require
完成後由 require
呼叫。它會傳入一個引數,即所需項目(套件名稱會轉換為路徑)的檔案名稱。它會在 require
完成時執行,無論是透過例外或完成 require 陳述式,而且您可以檢查 %INC
來判斷 require 是否成功。
require__after
鉤子會以先進後出的順序對每個需要的檔案呼叫。換句話說,如果 A 需要 B,而 B 需要 C,則 require__after
會先對 C 呼叫,然後是 B,最後才是 A。