Arrays Perl:从数组中打开文件并逐个读取

Arrays Perl:从数组中打开文件并逐个读取,arrays,regex,perl,Arrays,Regex,Perl,我有一个Perl数组,如下所示: my @dynfiles = ('dyn.abc.transcript', 'dyn.def.transcript', 'dyn.ghi.transcript', 'dyn.jkl.transcript'); foreach my $dynfile (@dynfiles) { print "$dynfile\n"; open my $fh , '<', $dynfile or die "Could not open file\n";

我有一个Perl数组,如下所示:

 my @dynfiles = ('dyn.abc.transcript', 'dyn.def.transcript', 'dyn.ghi.transcript', 'dyn.jkl.transcript');
foreach my $dynfile (@dynfiles) {
    print "$dynfile\n";
    open my $fh , '<', $dynfile or die "Could not open file\n";
    my %data;
    $data{$dynfile} = do {
        local $/ = undef;
        while (my $line = <$fh>) {
            chomp $line;
            if ($line =~ m/Errors:\s+0/) {
                print "Dyn run status: PASS\n";
            } else { 
                print "Dyn Run status : FAIL\n";
            }
        }
        close $fh;
    }
}
sub dynamo_check {

    opendir(my $dh, $log_file) or die "can't opendir $log_file: $!";
    my @dynfiles = grep { /^dynamo.*transcript$/ && -f "$log_file/$_" } readdir($dh);
    close $dh;

    foreach my $dynamofile (@dynfiles) {
        print "Checking file: $dynamofile\n";

        open my $fh, '<', $log_file . $dynamofile or die "$!\n";

        my $passed = 0;

        while(my $line = <$fh>) {
            if ($line =~ m/Errors\s*:\s*0/i) {
                $passed = 1;
                last;
            }
        }
        if ( $passed == 1 ) {
            print "Dynamo run status: PASS\n";
            $data{$dynamofile} = "pass";
        }else {
            print "Dynamo run status: FAIL\n";
            $data{$dynamofile} = "fail";
        }
    }
    print Dumper(\%data);
}
我正试图打开这些文件并逐一读取它们。为此,我有一个如下代码:

 my @dynfiles = ('dyn.abc.transcript', 'dyn.def.transcript', 'dyn.ghi.transcript', 'dyn.jkl.transcript');
foreach my $dynfile (@dynfiles) {
    print "$dynfile\n";
    open my $fh , '<', $dynfile or die "Could not open file\n";
    my %data;
    $data{$dynfile} = do {
        local $/ = undef;
        while (my $line = <$fh>) {
            chomp $line;
            if ($line =~ m/Errors:\s+0/) {
                print "Dyn run status: PASS\n";
            } else { 
                print "Dyn Run status : FAIL\n";
            }
        }
        close $fh;
    }
}
sub dynamo_check {

    opendir(my $dh, $log_file) or die "can't opendir $log_file: $!";
    my @dynfiles = grep { /^dynamo.*transcript$/ && -f "$log_file/$_" } readdir($dh);
    close $dh;

    foreach my $dynamofile (@dynfiles) {
        print "Checking file: $dynamofile\n";

        open my $fh, '<', $log_file . $dynamofile or die "$!\n";

        my $passed = 0;

        while(my $line = <$fh>) {
            if ($line =~ m/Errors\s*:\s*0/i) {
                $passed = 1;
                last;
            }
        }
        if ( $passed == 1 ) {
            print "Dynamo run status: PASS\n";
            $data{$dynamofile} = "pass";
        }else {
            print "Dynamo run status: FAIL\n";
            $data{$dynamofile} = "fail";
        }
    }
    print Dumper(\%data);
}
所以我担心的是,它根本不会读取数组中的文件。另外,这个文件
dyn.bxt.transcript
中有一个字符串
Errors:0
,但我仍然在输出中得到
dyn run status:FAIL
。 我做错什么了吗?我正在使用一个简单的模式匹配,不确定问题在哪里..请帮助


提前谢谢

首先,让Perl告诉您它无法打开文件的原因:

open my $fh , '<', $dynfile or die "Could not open file $!\n";

我不知道你在用
do
做什么。返回最后计算的表达式,在您的示例中为
close$fh
。但是,
%data
散列在块的每次迭代结束时消失。同样,去掉所有不属于调查这个问题的部分。

您可以使用一些经过良好测试的模块来减少代码。例如,使用我最喜欢的一款,你可以写:

use 5.014;
use warnings;
use Path::Tiny;

my @dynfiles = map { "dyn.$_.transcript" } qw(abc def ghi jkl);
say "Dyn run status: ",
    (path($_)->slurp =~ /error\s*:\s*0\b/i)
        ? "PASS"
        : "FAIL"
    for (grep {-f} @dynfiles);

在chat中查看、阅读您的代码并调试之后,我可能会这样做:

 my @dynfiles = ('dyn.abc.transcript', 'dyn.def.transcript', 'dyn.ghi.transcript', 'dyn.jkl.transcript');
foreach my $dynfile (@dynfiles) {
    print "$dynfile\n";
    open my $fh , '<', $dynfile or die "Could not open file\n";
    my %data;
    $data{$dynfile} = do {
        local $/ = undef;
        while (my $line = <$fh>) {
            chomp $line;
            if ($line =~ m/Errors:\s+0/) {
                print "Dyn run status: PASS\n";
            } else { 
                print "Dyn Run status : FAIL\n";
            }
        }
        close $fh;
    }
}
sub dynamo_check {

    opendir(my $dh, $log_file) or die "can't opendir $log_file: $!";
    my @dynfiles = grep { /^dynamo.*transcript$/ && -f "$log_file/$_" } readdir($dh);
    close $dh;

    foreach my $dynamofile (@dynfiles) {
        print "Checking file: $dynamofile\n";

        open my $fh, '<', $log_file . $dynamofile or die "$!\n";

        my $passed = 0;

        while(my $line = <$fh>) {
            if ($line =~ m/Errors\s*:\s*0/i) {
                $passed = 1;
                last;
            }
        }
        if ( $passed == 1 ) {
            print "Dynamo run status: PASS\n";
            $data{$dynamofile} = "pass";
        }else {
            print "Dynamo run status: FAIL\n";
            $data{$dynamofile} = "fail";
        }
    }
    print Dumper(\%data);
}
副发电机检查{
opendir(我的$dh,$log_文件)或die“无法opendir$log_文件:$!”;
my@dynfiles=grep{/^dynamo.*抄本$/&&f“$log\u file/$\u”}readdir($dh);
关闭$dh;
foreach my$dynamofile(@dynfiles){
打印“检查文件:$dynamofile\n”;

打开my$fh,'匹配区分大小写,或者您可以添加
/i
标志。另外,请使用适当的缩进设置代码格式。如果
错误
和分号之间有空格,则它将与您的正则表达式不匹配。它们之间有空格。看起来是这样的:'错误:0'。那么,执行正则表达式的最佳方法是什么?只要数字没有填充0,就可以执行
m/Errors\s*:\s*0/i
。类似
Errors:05
的操作仍然会匹配假阳性。另一种方法是
m/Errors\s*:\s*(\d+)/我
捕获了
$1
中的数字,并检查它是否为
0
。我启动了一个聊天室,加入,我会帮你调试:@chilemagic..这真的很有用,对我很有用!我正在尝试其他子程序中的逻辑,就像我们在聊天中讨论的一样,我面临一个问题..请在你有空的时候告诉我再次聊天?:)嘿@chmod,在聊天室发布关于这个问题的信息:我今天或明天会看一看!@chilemagic..终于能够更正脚本了..谢谢!:)关于模式匹配,你是对的-是的,这个字符串中有一个空格我错过了:“错误:0”,你建议的正则表达式有效!