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


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)
 
 

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

 Тема:    Автор:    Дата:  
 Re: несколько вопросов...   Artem Chuprina   04 Aug 2003 11:06:31 
 несколько вопросов...   Bulat Ziganshin   12 Aug 2003 20:24:28 
Архивное /ru.perl/1147755b797fc.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional