【发布时间】:2019-01-30 20:31:19
【问题描述】:
虽然在某些情况下我可能希望在我的代码中允许深度递归,但我希望能够在某些情况下(例如在测试时)禁用它。
我知道在使用调试器时我可以使用$DB::deep来指定最大递归深度,我所追求的功能基本相同但即使不在调试器中也可以使用。
我查看了 CPAN,但找不到任何东西。在 PerlMonks 上的搜索将我引向一个关于 changing the behaviour of the deep recursion warning 的线程。我所追求的是能够完全阻止递归(例如die,如果递归太深)。
这个功能存在吗?
如果解决方案允许我对其进行本地化,则可以加分,以便我可以控制最大递归深度的范围。
【问题讨论】:
-
如果您查看 perl 代码(至少这里是 github.com/Perl/perl5 ),您会看到警告的阈值
PERL_SUB_DEPTH_WARN用于警告和实际限制。但是,正如其他人所说,您需要重新编译您的 perl 二进制文件才能更改它。 -
你考虑过不使用递归吗?大多数问题都可以在没有它的情况下解决,然后您可以轻松限制他们处理的项目数量。
-
@briandfoy 我正在寻找这个的原因是为了捕捉非自愿递归,特别是在测试中。代码库中没有深度递归,因此这将确保如果 Perl 检测到深度递归,则测试将失败,而不会使机器陷入爬行状态。