eval在一段时间后无法匹配正则表达式

时间:2011-10-04 10:24:58

标签: regex perl recursion eval

我从用户那里得到第一个输入,这是一个树(具有显着的高度和深度)的节点。每个节点都包含一个正则表达式和修饰符。这棵树被保存在内存中。在应用程序启动时只执行一次。

第二个输入是从树的根节点开始匹配的值,直到找到完全匹配的叶节点(深度优先搜索)。比赛确定如下:

my $evalstr = <<EOEVAL;
if(\$input_value =~ /\$node_regex/$node_modifiers){
    1;
}else{
    -1;
}
EOEVAL

no strict 'refs';
my $return_value = eval "no strict;$evalstr";

第二个输入在整个应用程序的生命周期内由一个源连续提供。

问题: 上面的代码在一段时间内(大约10个小时)运行良好,但是在这个时间连续输入之后,eval连续开始失败并且我在$ return_value中得到-1。应用程序的所有其他功能都非常精细,包括其他比较语句。如果我重新启动应用程序,匹配将再次启动并提供正确的结果。

观察: 1)我多次得到深度递归警告,但我在某处读到这是正常的,因为考虑到输入树的大小,我的堆栈大小将超过100次。 2)如果我使用简单的逻辑进行正则表达式匹配而没有上述的eval,我对任何连续运行的应用程序都没有任何问题。

if($input_value =~ /$node_regex/){
    $return_value=1;
}else{
    $return_value=-1;
}

然后我必须牺牲动态修饰符,按照Dynamic Modifiers

检查: 1)我检查了$ @但它是空的。 2)同时打印$ input_value,$ node_regex和$ node_modifiers的相应值,它们是正确的,并且应该在失败点将该值与正则表达式匹配。 3)我检查了内存使用情况,但它在perl进程的时间内相当稳定。 4)使用perl 5.8.8然后将其更新为5.12,但仍面临同样的问题。

问题: 可能是上述问题的原因是什么?为什么它会在一段时间后失败,但在重新启动应用程序时运行良好?

1 个答案:

答案 0 :(得分:0)

一个明确的答案需要比我更多的perl内部知识。但鉴于你正在做的事情,连续解析大树,似乎可以安全地假设达到了一些限制,一些资源已经耗尽。我会仔细研究一下并确保在解析的每次迭代之间释放所有资源。我会特别关注复杂结构中的循环引用,并确保没有。