如何在Perl中设置硬递归深度限制?

5
尽管在某些情况下,我可能希望在代码中允许深度递归,但我希望能够在某些情况下禁用它(例如在测试时)。
我知道在使用调试器时,可以使用$DB::deep指定最大递归深度,我想要的功能基本上相同,但即使不在调试器中也可以使用。
我查看了CPAN,但找不到任何东西。在PerlMonks上搜索后,我找到了一个关于更改深递归警告行为的主题。我想要的是能够完全阻止递归(例如,如果递归过深,则die)。
这个功能存在吗?
如果解决方案允许我对其进行本地化,以便我可以控制最大递归深度的范围,则会获得额外的奖励分数。

如果你查看Perl代码(至少在这里https://github.com/Perl/perl5),你会发现警告“PERL_SUB_DEPTH_WARN”的阈值用于警告和实际限制。但是,正如其他人所说,你需要重新编译你的perl二进制文件来进行更改。 - ChatterOne
1
你有没有考虑不使用递归?大多数问题都可以在不使用递归的情况下解决,这样你就可以轻松地限制它们处理的项目数量。 - brian d foy
3
我希望你能翻译以下内容:@briandfoy,我需要找到这个东西是为了捕捉无意识的递归,特别是在测试中。这个代码库中没有深度递归,所以这样可以确保如果Perl检测到深度递归,则测试会失败,而不会使机器变得非常缓慢。 为了捕捉无意识的递归,尤其是在测试中,我需要这个东西。该代码库中没有深层递归,因此使用它可以确保如果Perl检测到深层递归,则测试失败,而不会使机器变得非常缓慢。请注意,不要改变原来的意思。 - jja
2个回答

9
作为之前回答的提到过的,你只能通过重新编译 Perl 来更改触发警告的级别。
但是你可以通过以下方法使现有的警告变为致命错误:
use warnings FATAL => 'recursion';

4
根据 perldoc perldiag 的说法:

子例程 "%s" 深度递归 (W 递归)
这个子例程已经直接或间接地调用了自身超过100次,但返回的次数却少于这个数量。这通常表示无限递归,除非你在编写奇怪的基准程序,否则它会指示其他一些问题。

可以通过重新编译perl二进制文件并将C预处理器宏PERL_SUB_DEPTH_WARN设置为所需值来改变此阈值。

因此,如果您不修改 perl 二进制文件,则无法本地化此行为。

嗯,看起来不太好。无论如何,这适用于修改“警告”的阈值。对我来说,能够修改该阈值并不那么重要,而是能够在警告触发时使Perl die - jja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接