【问题标题】:How can set a hard maximum recursion depth in Perl?如何在 Perl 中设置硬最大递归深度?
【发布时间】: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 检测到深度递归,则测试将失败,而不会使机器陷入爬行状态。

标签: perl recursion


【解决方案1】:

正如之前的答案所提到的,您只能通过重新编译 Perl 来更改触发警告的级别。

但是您可以像这样使现有警告致命:

use warnings FATAL => 'recursion';

【讨论】:

    【解决方案2】:

    根据perldoc perldiag

    子例程“%s”的深度递归(W 递归)
    这个子程序有 (直接或间接)称自己的次数是它的 100 倍 回来。这可能表示无限递归,除非你是 编写奇怪的基准程序,在这种情况下它表明 别的东西。

    这个阈值可以从 100 改变,通过重新编译 perl 二进制,将 C 预处理器宏 PERL_SUB_DEPTH_WARN 设置为 期望值。

    因此,除非您修改 perl 二进制文件,否则您似乎无法本地化该行为。

    【讨论】:

    • 嗯。不好看。在任何情况下,这都适用于修改警告的阈值。能够修改该阈值对我来说并不像能够在该警告触发时生成 Perl die 那样重要。
    猜你喜欢
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 2013-12-01
    • 2016-06-14
    相关资源
    最近更新 更多