Я получаю первый ввод от пользователя, который представляет собой дерево (имеющее значительную высоту и глубину) узлов.Каждый узел содержит регулярное выражение и модификаторы.Это дерево сохраняется в памяти.Это делается только один раз при запуске приложения.
Второй вход - это значение, которое соответствует начиная с корневого узла дерева до тех пор, пока не будет найден точно соответствующий листовой узел (Первый поиск по глубине).Совпадение определяется следующим образом:
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 постоянно начинает давать сбой, и я получаю -1 в $ return_value.Все остальные функции приложения работают очень хорошо, включая другие операторы сравнения. Если я перезапускаю приложение, сопоставление снова запускается и дает правильные результаты.
Замечания: 1) Я получаю глубокое предупреждение о рекурсии много раз, но я читаюгде-то это нормально, так как размер стека для меня будет больше 100 раз, учитывая размер входного дерева.2) Если я использую простую логику для соответствия регулярному выражению без eval, как описано выше, я не получаю никаких проблем при любом непрерывном запуске приложения.
if($input_value =~ /$node_regex/){
$return_value=1;
}else{
$return_value=-1;
}
, но затем я должен пожертвовать динамическими модификаторами согласно Динамические модификаторы
Проверки: 1) Я проверил $ @, но он пуст.2) Также напечатаны соответствующие значения $ input_value, $ node_regex и $ node_modifiers, они правильные и должны соответствовать значению с регулярным выражением в точке сбоя.3) Я проверил использование памяти, но оно довольно постоянное для процесса perl.4) Использовал ли Perl 5.8.8, затем обновил его до 5.12, но все еще столкнулся с той же проблемой.
Вопрос: Что может быть причиной вышеуказанной проблемы?Почему происходит сбой через некоторое время, но он хорошо работает при перезапуске приложения?