此變數決定允許的最大 eval EXPR
/BEGIN
或 require
/BEGIN
區塊巢狀層級。這表示它也控制 use
陳述式的最大巢狀層級。
預設值 1000 應足夠應付一般工作用途,如果您必須提高它,則您應該保守地選擇,否則您可能會遇到 C 堆疊耗盡而導致分段錯誤。實際程式碼不太可能使用深度超過 1000,但我們已將此設定為可配置,以防萬一。
設定為 0
時,eval EXPR
或 require EXPR
內的 BEGIN
區塊將完全禁止,並會觸發例外狀況,這將終止編譯,並且在 require
的情況下會擲回例外狀況,或在 eval
的情況下會如常將錯誤傳回 $@
。
考慮以下程式碼
perl -le'sub f { eval "BEGIN { f() }"; } f()'
每次呼叫 f()
都會消耗大量的 C 堆疊,而此變數用於導致此類程式碼終止,而不是耗盡 C 堆疊並觸發段落錯誤。不用說,此類程式碼並不常見,您不太可能實際需要提高設定值。然而,將其設定為 0 一段時間可能很有用,以防止在 eval EXPR
期間執行 BEGIN{} 區塊。
請注意,將其設定為 1 絕不會影響此類程式碼
BEGIN { $n += 1; BEGIN { $n += 2; BEGIN { $n += 4 } } }
原因在於 BEGIN 區塊會在完成後立即執行,因此最內層的區塊會在包含它的區塊完成編譯之前執行,而深度不會超過 1。事實上,上述程式碼等同於
BEGIN { $n+=4 }
BEGIN { $n+=2 }
BEGIN { $n+=1 }
這很明顯地說明了為何 ${^MAX_EVAL_BEGIN_DEPTH} 為 1 時不會封鎖此程式碼。
只有在 eval
或 require
(可能透過 use
)內執行的 BEGIN
才會受到影響。