Читать все файлы в каталоге в Perl - PullRequest
8 голосов
/ 13 апреля 2011

в первой части своего кода я читаю файл и храню разные его части в разных файлах в каталоге, а в следующем я хочу прочитать все файлы в этом каталоге, которые я создаю в первой части кода:

while(<file>){

#making files in directory Dir

}

opendir(Dir, $indirname) or die "cannot open directory $indirname";
@docs = grep(/\.txt$/,readdir(Dir));
foreach $d (@Dir) {
    $rdir="$indirname/$d";
    open (res,$rdir) or die "could not open $rdir";
    while(<res>){


}

но с этим кодом последняя строка последнего файла не будет читаться

Ответы [ 3 ]

16 голосов
/ 13 апреля 2011

Поскольку я не знаю, что вы делаете в цикле чтения строк, и не понимаю @docs и @Dir, я покажу код, который «работает» для меня:

use strict;
use warnings;
use English;

my $dir = './_tmp/readFID';
foreach my $fp (glob("$dir/*.txt")) {
  printf "%s\n", $fp;
  open my $fh, "<", $fp or die "can't read open '$fp': $OS_ERROR";
  while (<$fh>) {
    printf "  %s", $_;
  }
  close $fh or die "can't read close '$fp': $OS_ERROR";
}

выход:

./_tmp/readFID/123.txt
  1
  2
  3
./_tmp/readFID/45.txt
  4
  5
./_tmp/readFID/678.txt
  6
  7
  8

Возможно, вы сможете найти соответствующую разницу в вашем сценарии.

5 голосов
/ 13 апреля 2011

Я немного изменил код, чтобы просто проверить основную идею в каталоге, содержащем мои программы на Perl, и он, похоже, работает. Однако вам следует перебирать @docs вместо @dir (и я настоятельно рекомендую использовать прагмы строгого режима и предупреждения).

opendir(DIR, ".") or die "cannot open directory";
@docs = grep(/\.pl$/,readdir(DIR));
foreach $file (@docs) {
    open (RES, $file) or die "could not open $file\n";
    while(<RES>){
        print "$_";
    }
}
1 голос
/ 13 апреля 2011

glob делает то, что вы хотите, без открытия / закрытия. И как только вы вставляете группу файлов в @ARGV, оператор «diamond» работает как обычно.

@ARGV = <$indirname/*.txt>;
while ( <> ) { 
    ... 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...