Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> глубина рекурсии, ошибка deep 
:(
    Опции темы
burakov
Дата 24.3.2011, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Добрый день 

столкнулся с тем что при парсинге сайта перл 
выдал ошибку на глубину рекурсии

что это такое и как с этим бороться?
Спасибо.


--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
DEER
Дата 24.3.2011, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

Репутация: нет
Всего: 13



надо иметь терминальное (врое так называется smile ) условие завершения рекурсии.
Если так ругается - значит скорее всего ваш алгоритм не сможет выйти из рекурсии.

Покажите алгоритм, чтобы не экстрасенсы могли указать на ошибку


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
burakov
Дата 24.3.2011, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Код конечно можно, 

но там действительно глубокая рекурсия - я этого не отрицаю, вопрос в другом:

какую глубину рекурсии допускает perl?, или как то можно отключить контроль за глубиной рекурсии?

Код грабера прилагаю, попутный вопрос про то как контролируют ссылки, которые уже были отработаны (контент по ним сохранен в файл)
я их складывал в переменную $links, но оказалось в если складывать в массив то работает быстрее.
А нет ли в perle также ограничений на величину текстовой переменной или размер массива?
или может быть кто приведет пример грабера на perl (может чего я не так делаю?)


our @links = (); #массив со ссылками откуда shift делаем
our $links = ''; #строка со ссылками, где запоминаются все ссылки, которые уже были

if ($content =~ /$pattern/i) {
    while ($content =~ /$pattern/ig) {
        my $str = $1;
        if ($str ne '""') {
            $str =~ s/\"//g; 
            $str = $base_url.'?f='.$str; 
            push (@links, $str); 
        }
    }
}

#работаем по остальному содержимому

get_links (); #рекурсивно запускаемая подпрограмма

sub get_links {
    @links = delete_duplicate_from_array (@links);
    while (scalar (@links) > 0) {
        my $url = shift (@links); 
        if ($links !~ /$url/) {
            $links = $links.' '.$url;
            my $status = 0; 
            
            my $content = get_content ($url);
            my $str = undef;
            my $pattern = 'href="(.+\&i=.{36}?)"';
            while ($content =~ /$pattern/ig) {
                
                $str = $1;
                $str =~ s/\/catalogue\//$base_url/;
                print $str; 
                push (@links, $str); 
                $status = 1;
            }
            
            if ($status == 1) {
                $status = 0; 
                my $file = get_file_name ();
                $content = utf8_to_win1251 ($content); 
                content_to_file ($dir_result_html.'/'.$file, $content)
            }
        }
        
        get_links ();
    
    }
}

Код

our @links = (); #массив со ссылками откуда shift делаем
our $links = ''; #строка со ссылками, где запоминаются все ссылки, которые уже были

get_links (); #рекурсивно запускаемая подпрограмма

sub get_links {
    @links = delete_duplicate_from_array (@links);
    while (scalar (@links) > 0) {
        my $url = shift (@links); 
        if ($links !~ /$url/) {
            $links = $links.' '.$url;
            my $status = 0; 
            
            my $content = get_content ($url);
            my $str = undef;
            my $pattern = 'href="(.+\&i=.{36}?)"';
            while ($content =~ /$pattern/ig) {
                
                $str = $1;
                $str =~ s/\/catalogue\//$base_url/;
                print $str; 
                push (@links, $str); 
                $status = 1;
            }
            
            if ($status == 1) {
                $status = 0; 
                my $file = get_file_name ();
                $content = utf8_to_win1251 ($content); 
                content_to_file ($dir_result_html.'/'.$file, $content)
            }
        }
        
        get_links ();
    
    }
}



--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
ming
Дата 24.3.2011, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 30.1.2009
Где: Новосибирск

Репутация: нет
Всего: 3



в данном случае рекурсия вообще не нужна smile 

Код

sub get_links {
    while(1) {
        @links = delete_duplicate_from_array (@links);
        if (@links == 0) {
            last;
        }
        
        while (@links > 0) {
            my $url = shift (@links); 

            ... и остальное содержимое цикла вплоть до ...
            
            if ($status == 1) {
                $status = 0; 
                my $file = get_file_name ();
                $content = utf8_to_win1251 ($content); 
                content_to_file ($dir_result_html.'/'.$file, $content)
            }
        }
        #get_links ();  # рекурсивный вызов НЕ нужен совершенно
    }
}

PM MAIL ICQ Jabber   Вверх
burakov
Дата 24.3.2011, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Спасибо, за ответы.
но вопрос не в том как обойти рекурсию.
Вопрос почему возникает ошибка ???
где то читал, что можно как то отключить проверку перл на глубину рекурсии
и вообще почему перл считает, что рекурсия глубокая? по частоте циклов, по количеству запущенных подпрограмм?
просто память заканчивается ??

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




--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
shamber
Дата 28.3.2011, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 1
Всего: 18



Цитата(burakov @  24.3.2011,  21:21 Найти цитируемый пост)
Вопрос почему возникает ошибка ???

потому что иногда нужно делать return; и будет счастье.
PM MAIL Jabber   Вверх
burakov
Дата 28.3.2011, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



shamber, 

я не понял, smile

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

проясните ситуацию на примере ...

Спасибо.


Это сообщение отредактировал(а) burakov - 28.3.2011, 15:38


--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1025 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.