Arrays Perl:从数组中打开文件并逐个读取
我有一个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";
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”,你建议的正则表达式有效!