![]() |
Модераторы: ginnie, korob2001 |
![]() ![]() ![]() |
|
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Добрый день
столкнулся с тем что при парсинге сайта перл выдал ошибку на глубину рекурсии что это такое и как с этим бороться? Спасибо. |
|||
|
||||
DEER |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 749 Регистрация: 12.4.2005 Где: г. Рязань Репутация: нет Всего: 13 |
надо иметь терминальное (врое так называется
![]() Если так ругается - значит скорее всего ваш алгоритм не сможет выйти из рекурсии. Покажите алгоритм, чтобы не экстрасенсы могли указать на ошибку -------------------- |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 (); } }
|
|||
|
||||
ming |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 30.1.2009 Где: Новосибирск Репутация: нет Всего: 3 |
в данном случае рекурсия вообще не нужна
![]()
|
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Спасибо, за ответы.
но вопрос не в том как обойти рекурсию. Вопрос почему возникает ошибка ??? где то читал, что можно как то отключить проверку перл на глубину рекурсии и вообще почему перл считает, что рекурсия глубокая? по частоте циклов, по количеству запущенных подпрограмм? просто память заканчивается ?? давно давно, когда начинал писал чтение HDD рекурсивно (да кто этого не делал ![]() так вот почему ту никакой глубины рекурсии не возникает (вложенность каталогов маленькая?) хотя классы написанные тогда работают давно и сбоев ни разу не давали... где я их только не обкатывал. |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
||||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
shamber,
я не понял, ![]() Если можно код в студию, где return спасает от глубины рекурсии. Хоть я и обошел проблему (построил грабер через while), но мне действительно интересен ответ на данный вопрос, поскольку написано уже много классов, который используют рекурсию (я выше уже приводил пример с рекурсионным чтением каталогов) и хотя сбоев пока не было закралось смутное сомнение. проясните ситуацию на примере ... Спасибо. Это сообщение отредактировал(а) burakov - 28.3.2011, 15:38 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl: Системное программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |