${^MAX_NESTED_EVAL_BEGIN_BLOCKS}

此变量决定允许的最大 eval EXPR/BEGINrequire/BEGIN 块嵌套数量。这意味着它也控制 use 语句的最大嵌套深度。

默认值 1000 对于正常工作目的应该足够大,如果您必须提高它,那么您应该谨慎选择,否则您可能会遇到由于 C 栈耗尽而导致的段错误。似乎不太可能实际代码的嵌套深度超过 1000,但为了以防万一,我们将其设置为可配置的。

当设置为 0 时,eval EXPRrequire EXPR 中的 BEGIN 块将完全禁止,并会触发异常,这将终止编译,在 require 的情况下将抛出异常,或者在 eval 的情况下,像往常一样在 $@ 中返回错误。

考虑以下代码

perl -le'sub f { eval "BEGIN { f() }"; } f()'

每次调用 f() 都会消耗大量的 C 栈,此变量用于使此类代码死亡,而不是耗尽 C 栈并触发段错误。不用说,像这样的代码是不寻常的,您不太可能真正需要提高设置。但是,将其设置为 0 在有限的时间段内可能很有用,以防止 BEGIN{} 块在 eval EXPR 期间执行。

请注意,将此设置为 1 不会影响像这样的代码

BEGIN { $n += 1; BEGIN { $n += 2; BEGIN { $n += 4 } } }

原因是 BEGIN 块在完成时立即执行,因此最里面的 BEGIN 块将在包含它的块完成编译之前执行,深度不会超过 1。实际上,上面的代码等同于

BEGIN { $n+=4 }
BEGIN { $n+=2 }
BEGIN { $n+=1 }

这使得 ${^MAX_EVAL_BEGIN_DEPTH} 为 1 不会阻止此代码的原因显而易见。

只有在 evalrequire(可能通过 use)内部执行的 BEGIN 会受到影响。