Для анализа нескольких файлов в Perl - PullRequest
0 голосов
/ 09 марта 2020

Пожалуйста, исправьте мой код, я не могу открыть свой файл для анализа. Ошибка в этой строке open(my $fh, $file) or die "Cannot open file, $!"; Невозможно открыть файл. Нет такого файла или каталога в строке ./sample.pl 28.

use strict;
my $dir = $ARGV[0];

my $dp_dpd = $ENV{'DP_DPD'};

my $log_dir = $ENV{'DP_LOG'};
my $xmlFlag = 0;
my @fileList = "";

my @not_proc_dir = `find $dp_dpd -type d -name "NotProcessed"`;

#print "@not_proc_dir\n";


foreach my $dir (@not_proc_dir) {
        chomp ($dir);
        #print "$dir\n";

    opendir (DIR, $dir) or die "Couldn't open directory, $!";
    while ( my $file = readdir DIR) {
            next if $file =~ /^\.\.?$/;
            next if (-d $file);
       #   print "$file\n";
            next if $file eq "." or $file eq "..";
                    if ($file =~ /.xml$/ig) {
                     $xmlFlag = 1;
                     print "$file\n";
                     open(my $fh, $file) or die "Cannot open file, $!";
                    @fileList = <$fh>;
                    close $file;


                    }

            }
            closedir DIR;

}

1 Ответ

8 голосов
/ 09 марта 2020

Цитирование readdir * документации :

Если вы планируете проверить возвращаемые значения из readdir, вам лучше добавить нужный каталог в каталог , В противном случае, поскольку мы не сделали chdir, он бы протестировал не тот файл.

Поэтому ваш open(my $fh, $file) должен быть open my $fh, '<', "$dir/$file" (обратите внимание, как я также добавил '<': Вы всегда должны использовать 3 аргумента open).

Ваш next if (-d $file); также неверен и должен быть next if -d "$dir/$file";


Некоторые дополнительные замечания по вашему коду:

  • всегда добавлять use warnings к вашему сценарию (в дополнение к use strict, который у вас уже есть)

  • используйте лексический дескриптор файла / каталога, а не глобальный. То есть, сделайте opendir my $DH, $dir вместо opendir DH, $dir.

  • для правильного отступа вашего кода (if ($file =~ /.xml$/ig) { слишком глубоко на один уровень; вам сложнее читать ваш код)

  • next if $file =~ /^\.\.?$/; и next if $file eq "." or $file eq ".."; являются избыточными (даже если не технически эквивалент); Я бы предложил использовать только последнее.

  • переменная $dir, определенная в my $dir = $ARGV[0];, никогда не используется.

...