|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Artem Chuprina 2:5020/400 04 Aug 2003 11:06:31 To : "Denis Nikiforov" Subject : Re: несколько вопросов... -------------------------------------------------------------------------------- Хмутро. DN>>> 1) DN>>> если создать объект некоторого класса и не записать ссылку на него в DN>>> конкретную переменную: DN>>> HTML::LinkExtor->new(); DN>>> то как долго проживёт этот объект? DN>>> если я, например, в цикле создаю такие "анонимные" объекты: DN>>> for (;;) { DN>>> HTML::LinkExtor->new(); DN>>> } DN>>> то они скапливаются где-то в памяти или уничтожаются по завершении DN>>> каждой итерации цикла, или по завершении всего цикла? AC>> Как придется. Hе следует полагаться как на то, что они будут уничтожены AC>> сразу по окончании оператора (а отнюдь не итерации цикла), так и на то, AC>> что они доживут до конца цикла. Тем более что до конца вечного цикла AC>> дожить невозможно. Hо скорее всего, на практике будут убиваться по AC>> завершении каждой итерации цикла. DN> понятно, такая неопределённость, имхо, не красит язык/интерпретатор Hе скажи. Это возможность для интерпретатора соптимизировать работу. Чем на более низком уровне специфицировано поведение, тем меньше возможностей для оптимизации. DN>>> 2) DN>>> sub getLinks {...} DN>>> HTML::LinkExtor->new(\&getLinks, $base_url); DN>>> бред конечно :) DN>>> но можно ли как-нибудь передавать в call-back функцию дополнительные DN>>> параметры? DN>>> например, хочется помимо параметров, которые передаёт туда объект DN>>> HTML::LinkExtor передавать ещё и $base_url AC>> my $base_url = ....; # важно, что она my AC>> my $callback = sub { getLinks($base_url, @_); } AC>> HTML::LinkExtor->new($callback); AC>> За подробностями - perldoc -q closure, а там куда пошлют. DN> интересно DN> чем-то мне всё это напоминает Lisp :-) Hу, типа да... Оттуда и взято. DN>>> 3) 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 DN>>> {$_ ne '.' && $_ ne '..'} keys %dir) { $_ = catfile($curDir, DN>>> $curFile = $_); scanDir($_), next if (-d); next if DN>>> (!/\.(??{join('|', @ext)})$/i); # обработка файла } } DN>>> причём, при сканировании директории сначала нужно обработать в ней все DN>>> найденные файлы, и только после этого переходить в подпапку (для чего DN>>> и используется sort) на мой взгляд вся эта конструкция несколько DN>>> громоздка и, надо думать, тормознута может её можно как-нибудь DN>>> упростить? AC>> Упростить можно, сложнее вопрос с "ускорить". AC>> $ext_re = '\.('.join('|',@ext).')$'; AC>> $ext_re = qr/$ext_re/i; AC>> sub scanDir($) { AC>> my ($curDir) = @_; AC>> opendir(DIR, $curDir); AC>> my @files = <DIR>; AC>> closedir(DIR); AC>> my $re = AC>> for (@files) { AC>> next if /$ext_re/; AC>> # обработка файла AC>> } AC>> for (grep { -d "$curDir/$_" } @files) { AC>> scanDir("$curDir/$_"); AC>> } AC>> } DN> вобщем-то это перефразировка Hе вполне. Во-первых, минус стадия сортировки. Во-вторых, предкомпиляция регекса. В-третьих, тебе этот код потом править? Если да, то перефразировка - вполне содержательное изменение. -- 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/1147755b797fc.html, оценка из 5, голосов 10
|