|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Konstantin Stupnik 2:5020/400 17 Jul 2001 12:37:50 To : All Subject : Re: Ускорить выполнение -------------------------------------------------------------------------------- "Nikolay Pichtin" <Nikolay.Pichtin@f30.n5056.z2.fidonet.org> wrote in message news:995320505@f30.n5056.z2.ftn... > Добрый вечер Konstantin ! > > > >> Есть скрипт, который читает каталог и отбирает > >> имена файлов по расширению. > >> Можно-ли оптимизировать скрипт с целью ускорения работы? > >> > >> if ( opendir (DIR, "$full_upload_dir") ) { > >> @dirs = map {/(.+)/} sort {$a <=> $b} readdir(DIR); > > KS> Это что за загадочная строка???? > KS> Кто тебя такому научил? > KS> 1) <=> сравнивает ЧИСЛА. Для строк есть cmp. > > Все правильно. У меня имена каталогов числовые. Hо, если уж речь зашла об ускорении выполнения, то с cmp будет быстрее. > KS> 2) зачем map??? Или это очередной способ удаления гланд > KS> через задний проход? > KS> 3) а вообще зачем sort именно тут? > KS> лучше уж результат отсортировать. > KS> Там, теоретически, меньше сортировать. > > Согласен. > > >> closedir (DIR); > > [Skip] > > KS> foreach $file(@dirs) > KS> { > KS> my ($name,$ext)=$file=~/^(.*)\.(.*)$/; > KS> push @files,$name,$ext if($typs{$ext}); > KS> } > KS> @files=sort @files; > > Спасибо за ответ, но не проходит. Т.к. в каталоге > есть файлы с разными именами, но одним расширением. > Их надо сортировать так, чтобы сначала все одни расширения, > затем другие и т.д. Hу, я ж не телепат, что б заранее предугадать, то, как тебе надо :) Хотя я чуток лажанулся. У тебя в массив зачем-то еще и расширения складывались... Может так: push @files,{name=>$name,ext=>$ext} if $ $typs{$ext}; } @files=sort {$a->{ext} eq $b->{ext}?$a->{name} cmp $b->{name}: $a->{ext} cmp $b->{ext}} @files; > Я извратился так: > > if ( opendir (DIR, "numers/2001") ) { > @dirs = map {/(\d+)/} sort {$a <=> $b} readdir(DIR); > closedir (DIR); > $dir_numer = $dirs[-1]; # Это для того, чтобы читать все каталоги, но > } # затем обрабатывать только с самым старшим номером А зачем их вообще тогда все в массив пихать? > @link_file = <numers/2001/$dir_numer/*>; # Вот здесь бы вместо * как-то бы > # ограничить просмотр Hу только глоббинга еще и не хватало. /(open|read|close)dir/ было более правильным решением :) > s/numers\/2001\/$dir_numer\/// foreach (@link_file); Если в RE часто используются /, стоит использовать другой разделитель. s!numers/2001/$dir_numer/!! for(@link_file); чуток добавит читабельности. > @link_files = sort { ($a =~ /(.*)\.(.*)/)[1] cmp ($b =~ /(.*)\.(.*)/)[1] } > @link_file; Это отсортирует только по расширению. Для каждого расширения файлы остануться unsorted. И я бы не рекомендовал так делать. Сделается O(n*log(n)) сравнений. И для каждого сравнения будет делаться 2 RE матча! Посмотри пример выше. -- Best regards, Konstantin. Brainbench MVP for perl. Отправлено через сервер Talk.Ru - http://www.talk.ru --- ifmail v.2.15dev5 * Origin: Talk.Ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/648855b9617a.html, оценка из 5, голосов 10
|