Как установить жесткую максимальную глубину рекурсии в Perl? - PullRequest
0 голосов
/ 24 августа 2018

Хотя в некоторых случаях мне может потребоваться разрешить глубокие рекурсии в моем коде, я хочу иметь возможность отключить его в некоторых случаях (например, во время тестирования).

Я знаю, что при использовании отладчика я могуиспользуйте $DB::deep, чтобы указать максимальную глубину рекурсии, и нужная мне функция в основном та же самая, но ее можно использовать, даже когда нет в отладчике.

Я посмотрел в CPAN, но не смог найтичто-нибудь.И поиск по PerlMonks привел меня к теме о изменении поведения глубокой рекурсии warning .Я хочу иметь возможность полностью блокировать рекурсии (например, die, если рекурсия становится слишком глубокой).

Существует ли эта функция?

Бонусные баллы, если решениепозволяет мне его локализовать, чтобы я мог контролировать область максимальной глубины рекурсии.

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Как упоминалось в предыдущем ответе, вы можете изменить уровень, который вызывает предупреждение, перекомпилировав Perl.

Но вы можете сделать существующее предупреждение смертельным, как это:

use warnings FATAL => 'recursion';
0 голосов
/ 24 августа 2018

Согласно perldoc perldiag :

Глубокая рекурсия для подпрограммы "% s" (W-рекурсия)
Эта подпрограмма имеет назвал себя (прямо или косвенно) в 100 раз больше, чем имеет вернулся. Это, вероятно, указывает на бесконечную рекурсию, если вы не написание странных тестовых программ, в этом случае это указывает что-то еще.

Этот порог можно изменить со 100, перекомпилировав perl двоичный файл, установив макрос препроцессора C PERL_SUB_DEPTH_WARN в желаемое значение.

Так что кажется, что вы не можете локализовать поведение, если не измените двоичный файл perl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...