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


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Pavel Ammosov                        2:5020/52      10 Sep 2001  01:08:04
 To : Sergey Yurevich
 Subject : Re: Про получение списка фа  йлов
 -------------------------------------------------------------------------------- 
 
 
 SY> Вот состряпал код, который бы получал список файлов в 
 SY>каталоге и подкоталогах, но что-то не хочет работать. Исправьте плз что 
 SY>неправильно.
 
 Это все один большой ужаc.  Ты по какому мануалу перл учил, вообще? :)
 
 SY>&get_list("$SEARCH_DIR");
 
 & и кавычки тут лишние: get_list($SEARCH_DIR);
 
 SY>sub get_list {
 SY>local($SEARCH_ROOT, $search_sub) = @_;
 
 вместо local тут надо my().
 
 SY>chdir("$SEARCH_ROOT$search_sub");
 
 Результат chdir надо проверять: 
 chdir("$SEARCH_ROOT$search_sub") or die "Can't cd to $SEARCH_ROOT$search_sub:
 $!";
 Тогда ты бы увидел, что между $SEARCH_ROOT и $search_sub надо поставить /:
 chdir("$SEARCH_ROOT/$search_sub") or die "Can't cd to $SEARCH_ROOT/$search_sub: 
 $!";
 
 SY>local(@filenames) = <*>;
 
 Глоб давить, opendir, grep ... readdir, closedir
 юзать. Особенно в таких простых случаях.
 
 SY>local($file);
 SY>foreach $file (@filenames) {
 
 foreach my $file (@filenames) {
 
 SY>if (-d $file && -r $file){
 
 Hа unix-системах  -r недостаточно для chdir.  Hадо еще и -x, на которую 
 ты не проверил.
 
 SY>if ($search_dir){&get_list (SEARCH_ROOT, "$search_sub$file");}
 
 У SEARCH_ROOT забыл знак $
 
 SY>else{&get_list (SEARCH_ROOT, $file);}
 SY>}
 SY>else {&search_in_file ("$file");}
 SY>}}
 
 Если бы нормально расставлял скобки, то, может бы, и
 заметил, что после chdir() в начале функции ты остаешься
 в том же каталоге, но вызывающая функция этого не знает.
 
 Либо используй полные пути от корня, либо в конце пиши chdir('..');
 
 #!/usr/bin/perl -w
 use strict;
 my $SEARCH_DIR = '/tmp';
 
 get_list($SEARCH_DIR);
 
 sub get_list {
   my ($SEARCH_ROOT) = @_;
   chdir($SEARCH_ROOT) or die "Can't chdir to $SEARCH_ROOT: $!";
   opendir DIR, '.' or die "opendir .: $!";
   my (@filenames) = grep{! /^\.\.?$/} readdir DIR;
   closedir DIR;
   foreach my $file (@filenames) {
    if (-d $file) {
       get_list($file);
    } else {
       search_in_file ($file);
    }
   }
   chdir('..') or die "chdir ..:$!"
 }
 
 sub search_in_file {
   my $file = shift;
   warn "search_in_file($file)";
 }
 
 И вариант с File::Find:
 
 #!/usr/bin/perl -w
 use strict;
 use File::Find;
 
 my $SEARCH_DIR = '/tmp';
 
 find(\&search_in_file, $SEARCH_DIR);
 
 sub search_in_file() {
   my $file = $_;
   warn "search_in_file($file)";
 }
 
 -- 
 Pavel Ammosov                                               O    \
 apavel@aha.ru                                                 __  )
 http://isabase.philol.msu.ru/~apavel/                             )
 wget -O - isabase.philol.msu.ru/~apavel/key.asc|pgp -fka    O    /
 
 --- FIDOGATE 4.4.0-snp10
  * Origin: Zenon N.S.P. news server (2:5020/52.0)
 
 

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

 Тема:    Автор:    Дата:  
 Re: Про получение списка фа йлов   Pavel Ammosov   10 Sep 2001 01:08:04 
Архивное /ru.perl/3056135d72a6c.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional