我在下面写了提及代码来读取文件并将数据存储到数组@s_arr
。
但是当我试图在块外打印@s_arr
数组时,它什么也没显示。
use Data::Dumper;
my @s_arr;
my @err;
my %sort_h_1;
$fname = '/qv/Error.log';
open( IN, "<$fname" );
foreach $line ( <IN> ) {
if ( $line =~ /CODE\+(\w{3})(\d{5})/ ) {
$a = "$1$2";
push @err, $a;
}
}
close IN;
$prev = "";
$count = 0;
my %hash;
foreach ( sort @err ) {
if ( $prev ne $_ ) {
if ( $count ) {
$hash{$prev} = $count;
}
$prev = $_;
$count = 0;
}
$count++;
}
print Dumper \%hash;
printf( "%s:%d\n", $prev, $count ) if $count;
$hash{$prev} = $count;
my $c = 0;
print "Today Error Count\n";
foreach my $name ( sort { $hash{$b} <=> $hash{$a} } keys %hash ) {
#printf "%-8s %s\n", $name, $hash{$name};
#my %sort_h ;
push @s_arr, $name;
push @s_arr, $hash{$name};
#$sort_h{$name} = $hash{$name} ;
#print Dumper \%sort_h ;
#print Dumper \@s_arr ;
$c++;
if ( $c eq 30 ) {
exit;
}
}
print Dumper \@s_arr; # It's showing nothing
答案 0 :(得分:4)
您正在foreach
循环中调用exit
。这使程序停止,永远不会到达print Dumper @s_arr
。
要摆脱循环,您需要使用last
。
foreach my $name ( sort ... ) {
# ...
$c++;
last if $c == 30; # break out of the loop when $c reaches 30
}
我在这里使用了if
的 postfix 变体,因为这样可以更容易阅读。另请注意as zdim pointed out above,检查数字时应使用数字等式检查==
。 eq
用于字符串。