eval не может соответствовать регулярному выражению через некоторое время - PullRequest
0 голосов
/ 04 октября 2011

Я получаю первый ввод от пользователя, который представляет собой дерево (имеющее значительную высоту и глубину) узлов.Каждый узел содержит регулярное выражение и модификаторы.Это дерево сохраняется в памяти.Это делается только один раз при запуске приложения.

Второй вход - это значение, которое соответствует начиная с корневого узла дерева до тех пор, пока не будет найден точно соответствующий листовой узел (Первый поиск по глубине).Совпадение определяется следующим образом:

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, но все еще столкнулся с той же проблемой.

Вопрос: Что может быть причиной вышеуказанной проблемы?Почему происходит сбой через некоторое время, но он хорошо работает при перезапуске приложения?

1 Ответ

0 голосов
/ 04 октября 2011

Для окончательного ответа потребуется больше знаний о perl, чем у меня. Но, учитывая то, что вы делаете, непрерывный анализ больших деревьев, кажется безопасным предположить, что какой-то предел достигнут, какой-то ресурс исчерпан. Я бы внимательно посмотрел на вещи и убедился, что все ресурсы высвобождаются между каждой итерацией разбора. Я был бы особенно обеспокоен циклическими ссылками в сложных структурах и проверкой их отсутствия.

...