caller EXPR
caller

傳回目前純 Perl 子例程呼叫的內容。在純量內容中,如果存在呼叫者(也就是說,如果我們在子例程或 evalrequire 中),則傳回呼叫者的套件名稱,否則傳回未定義的值。caller 永遠不會傳回 XS 子例程,而且會略過它們。在 caller 的傳回值中,下一個純 Perl 子例程會顯示在 XS 子例程的位置。在清單內容中,caller 傳回

   # 0         1          2
my ($package, $filename, $line) = caller;

如同 __FILE____LINE__,這裡傳回的文件名稱和行號可能會因 perlsyn 中所述的機制而有所不同,請參閱 "Plain Old Comments (Not!)" in perlsyn

使用 EXPR 時,它會傳回一些額外的資訊,偵錯程式會使用這些資訊來列印堆疊追蹤。EXPR 的值表示在目前的執行緒之前要回溯幾個呼叫框架。

   #  0         1          2      3            4
my ($package, $filename, $line, $subroutine, $hasargs,

   #  5          6          7            8       9         10
   $wantarray, $evaltext, $is_require, $hints, $bitmask, $hinthash)
 = caller($i);

在此,$subroutine 是呼叫者呼叫的函數(而不是包含呼叫者的函數)。請注意,如果框架不是子例程呼叫,而是 eval,則 $subroutine 可能是 (eval)。在這種情況下,會設定額外的元素 $evaltext 和 $is_require:如果框架是由 requireuse 陳述式建立的,則 $is_require 為 true,$evaltext 包含 eval EXPR 陳述式的文字。特別是,對於 eval BLOCK 陳述式,$subroutine 為 (eval),但 $evaltext 未定義。(另請注意,每個 use 陳述式都會在 eval EXPR 框架內建立一個 require 框架。)如果這個特定子例程碰巧已從符號表中刪除,則 $subroutine 也可能是 (unknown)。如果為框架設定了 @_ 的新執行個體,則 $hasargs 為 true。$hints$bitmask 包含呼叫者編譯時使用的實用提示。$hints 對應到 $^H,而 $bitmask 對應到 ${^WARNING_BITS}$hints$bitmask 值可能會在 Perl 的不同版本之間有所不同,而且不打算供外部使用。

$hinthash 是對呼叫者編譯時 %^H 值的雜湊參照,或者如果 %^H 為空,則為 undef。請勿修改此雜湊的值,因為它們是儲存在 optree 中的實際值。

請注意,唯一可見的呼叫框架類型為子常式呼叫和 eval。其他形式的內容,例如 whileforeach 迴圈或 try 區塊,不會被 caller 視為有趣,因為它們不會改變 return 表達式的行為。

此外,當從 DB 套件內部以清單內容呼叫,並帶有參數時,caller 會傳回更詳細的資訊:它會將清單變數 @DB::args 設定為子常式被呼叫時的參數。

請注意,最佳化器可能會在 caller 有機會取得資訊之前,最佳化呼叫框架。這表示 caller(N) 可能不會傳回您預期的呼叫框架資訊,對於 N > 1。特別是,@DB::args 可能有來自 caller 上次被呼叫時的資訊。

請注意,設定 @DB::args 是「盡力而為」,用於除錯或產生回溯,不應依賴它。特別是,由於 @_ 包含呼叫者參數的別名,因此 Perl 不會複製 @_,所以 @DB::args 會包含子常式對 @_ 或其內容所做的修改,而不是呼叫時的原始值。@DB::args 就像 @_ 一樣,不持有其元素的明確參考,因此在某些情況下,其元素可能會被釋放並重新配置給其他變數或暫時值。最後,目前實作的一個副作用是,shift @_ 的效果通常可以被復原(但 pop @_ 或其他拼接不行,而且如果已取得 @_ 的參考,而且受重新配置元素的警告影響),因此 @DB::args 實際上是 @_ 的目前狀態和初始狀態的混合。買方自行注意。