|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Artem Chuprina 2:5020/400 01 Aug 2003 16:59:10 To : "Denis Nikiforov" Subject : Re: несколько вопросов... -------------------------------------------------------------------------------- Хмутро. DN> Hello, All! DN> 1) DN> если создать объект некоторого класса и не записать ссылку на него в DN> конкретную переменную: DN> HTML::LinkExtor->new(); DN> то как долго проживёт этот объект? DN> если я, например, в цикле создаю такие "анонимные" объекты: DN> for (;;) { DN> HTML::LinkExtor->new(); DN> } DN> то они скапливаются где-то в памяти или уничтожаются по завершении каждой DN> итерации цикла, или по завершении всего цикла? Как придется. Hе следует полагаться как на то, что они будут уничтожены сразу по окончании оператора (а отнюдь не итерации цикла), так и на то, что они доживут до конца цикла. Тем более что до конца вечного цикла дожить невозможно. Hо скорее всего, на практике будут убиваться по завершении каждой итерации цикла. DN> 2) DN> sub getLinks {...} DN> HTML::LinkExtor->new(\&getLinks, $base_url); DN> бред конечно :) DN> но можно ли как-нибудь передавать в call-back функцию дополнительные DN> параметры? DN> например, хочется помимо параметров, которые передаёт туда объект DN> HTML::LinkExtor передавать ещё и $base_url my $base_url = ....; # важно, что она my my $callback = sub { getLinks($base_url, @_); } HTML::LinkExtor->new($callback); За подробностями - perldoc -q closure, а там куда пошлют. DN> 3) DN> нужно рекурсивно перебрать все файлы в некоторой директории с заданными DN> расширениями DN> делаю это так: DN> @ext = ('html', 'htm', 'shtml', 'lhtml'); DN> sub scanDir($) DN> { DN> my ($curDir) = @_; DN> tie my %dir, IO::Dir, $curDir; DN> foreach (sort {$dir{$b}->mode <=> $dir{$a}->mode || $a cmp $b} grep {$_ ne DN> '.' && $_ ne '..'} keys %dir) { DN> $_ = catfile($curDir, $curFile = $_); DN> scanDir($_), next if (-d); DN> next if (!/\.(??{join('|', @ext)})$/i); DN> # обработка файла DN> } DN> } DN> причём, при сканировании директории сначала нужно обработать в ней все DN> найденные файлы, и только после этого переходить в подпапку (для чего и DN> используется sort) DN> на мой взгляд вся эта конструкция несколько громоздка и, надо думать, DN> тормознута DN> может её можно как-нибудь упростить? Упростить можно, сложнее вопрос с "ускорить". $ext_re = '\.('.join('|',@ext).')$'; $ext_re = qr/$ext_re/i; sub scanDir($) { my ($curDir) = @_; opendir(DIR, $curDir); my @files = <DIR>; closedir(DIR); my $re = for (@files) { next if /$ext_re/; # обработка файла } for (grep { -d "$curDir/$_" } @files) { scanDir("$curDir/$_"); } } -- Artem Chuprina RFC2822: <ran@ran.pp.ru>, FIDO: 2:5020/122.256, ICQ: 13038757 --- ifmail v.2.15dev5 * Origin: Leninsky 45 home network (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/114771b7d353b.html, оценка из 5, голосов 10
|