[PERL] Как установить глубину рекурсии

Yevgen
Дата: 28.08.2006 15:05:43
Возникла проблема с рекурсивным вызовом функции. Насколько я понял, ограничение в Perl на рекурсию есть, и оно равно 100 уровням вложености. При выплнении своего скрипта получаю такое сообщение:

Deep recursion on subroutine "api_vts_modules::api_tree_maker::PrnTree" at c:/PROGRA~1/ACTIVE~1.5/lib/support/dbgp/perllib/perl5db.pl line 4251.

Подскажите пожалуйста, как можно увеличить количество уровней вложенности для рекурсии в Perl.

Заранее благодарен.
g613
Дата: 28.08.2006 15:23:07
Yevgen
Возникла проблема с рекурсивным вызовом функции. Насколько я понял, ограничение в Perl на рекурсию есть, и оно равно 100 уровням вложености.[]/quot]
нет. ты не правильно понял.

[quot]При выплнении своего скрипта получаю такое сообщение:

Deep recursion on subroutine "api_vts_modules::api_tree_maker::PrnTree" at c:/PROGRA~1/ACTIVE~1.5/lib/support/dbgp/perllib/perl5db.pl line 4251.

Подскажите пожалуйста, как можно увеличить количество уровней вложенности для рекурсии в Perl.

Заранее благодарен.


код показывайте, ибо
sub main {
    my $i = shift;
    print "$i\n";
    return if $i > 100_000;
    main($i+1);
}

main(1);
вполне себе работает...
Anjey aka PM
Дата: 28.08.2006 22:10:50
сторонний модуль? поищи в его конфигурации, Перл тут имхо непричем
Yevgen
Дата: 29.08.2006 01:59:40
Anjey aka PM
сторонний модуль? поищи в его конфигурации, Перл тут имхо непричем


Что значит "в его конфигурации"?
amge
Дата: 29.08.2006 09:40:19
Yevgen
При выплнении своего скрипта получаю такое сообщение:
Deep recursion on subroutine ...
Это лишь предупреждение от Perl (скрипт будет продолжать выполняться). Оно означает, что подпрограмма вызвала себя на 100 раз больше, чем вернулась. Разработчики Perl'а полагают, что такого не должно быть, если только вы не пишете какой-то очень специальный софт (см. perldoc perldiag).
Выдачу этого предупреждения можно отключить (см. perldoc perllexwarn), если вместо ключика -w (#!/usr/bin/perl -w) использовать
use warnings('all');
no warnings('recursion');
Yevgen
Дата: 29.08.2006 14:46:26
amge
Yevgen
При выплнении своего скрипта получаю такое сообщение:
Deep recursion on subroutine ...
Это лишь предупреждение от Perl (скрипт будет продолжать выполняться). Оно означает, что подпрограмма вызвала себя на 100 раз больше, чем вернулась. Разработчики Perl'а полагают, что такого не должно быть, если только вы не пишете какой-то очень специальный софт (см. perldoc perldiag).
Выдачу этого предупреждения можно отключить (см. perldoc perllexwarn), если вместо ключика -w (#!/usr/bin/perl -w) использовать
use warnings('all');
no warnings('recursion');


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

Теперь все работает - я сделал обработку по-другому. Собственно, чтобы не быть голословным вот функция вывода на печать:
sub PrnTree {
    my $self = shift;
    my $tr   = shift;
    my $spc  = shift;
    my $j;
    my $i;
    my $k;
    
Next_level:
    $k = 0;
    if(defined $tr->{child}) {
        foreach $j(@{$tr->{child}})
        {
            for($i=0;$i<=$spc;$i++)
            {
                print "*";
            }
            print $j->{val}->{id}.":".$j->{val}->{name}." ".$j->{test}." (".$spc.")"."\n";
            if(defined $j->{child}) {
                $k = $j;
            }
        }
        if($k != 0) {
            $spc++;
            $tr = $k;
            goto Next_level;
        }
    }
}

Спасибо за помошь, amge, и спасибо всем, кто попытался мне помочь.