此变量决定允许的最大 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 在有限的时间段内可能很有用,以防止 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 不会阻止此代码的原因显而易见。
只有在 eval
或 require
(可能通过 use
)内部执行的 BEGIN
会受到影响。