傳回目前純 Perl 子例程呼叫的內容。在純量內容中,如果存在呼叫者(也就是說,如果我們在子例程或 eval
或 require
中),則傳回呼叫者的套件名稱,否則傳回未定義的值。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
:如果框架是由 require
或 use
陳述式建立的,則 $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
。其他形式的內容,例如 while
或 foreach
迴圈或 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
實際上是 @_
的目前狀態和初始狀態的混合。買方自行注意。