Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: несколько вопросов...   Artem Chuprina   01 Aug 2003 16:59:10 
 Re: несколько вопросов...   Denis Nikiforov   01 Aug 2003 20:34:29 
Архивное /ru.perl/114771b7d353b.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional