|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/3056135d72a6c.html, оценка из 5, голосов 10
|