如何在Perl中设置硬的最大递归深度?

时间:2018-08-24 11:05:34

标签: perl recursion

尽管在某些情况下,我可能希望在代码中允许深度递归,但在某些情况下(例如在测试时),我希望能够禁用它。

我知道在使用调试器时,我可以使用$DB::deep指定最大递归深度,而我所追求的功能基本上是相同的,但是即使不在调试器中也可以使用。

我看过CPAN,但找不到任何东西。在PerlMonks上进行的搜索使我进入了关于changing the behaviour of the deep recursion warning的话题。我追求的是一种能够完全阻止递归的功能(例如,如果递归的深度太深,例如die

此功能存在吗?

如果解决方案允许我对它进行定位,则奖励点,以便我可以控制最大递归深度的范围。

2 个答案:

答案 0 :(得分:9)

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

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

i = int(len(l)*"%x" % tuple(l), 16)
print(hex(i))

答案 1 :(得分:4)

根据perldoc perldiag

  

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

     

可以通过重新编译perl将该阈值从100更改为   二进制文件,将C预处理程序宏PERL_SUB_DEPTH_WARN设置为   期望值。

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