2017-04-14 48 views
0

我已经写了下面提到的代码来读取文件并将数据存储到数组@s_arrperl变量不存储块外的数据

但是,当我试图在块外打印@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 
+1

如果您希望人们通读它,请在发布问题时很好地缩进代码。正如你在上面很好地声明'@ s_arr',一个可以想象的理由是其中没有任何内容,但'Dumper'的'%hash'打印表明否则。所以......你的'$ c'实际上等于'30',所以这个程序安静地'退出'? (顺便说一下,应该使用'=='那里。) – zdim

回答

4

要调用exitforeach循环内。这会使程序停止,并且永远不会到达print Dumper @s_arr

要打破循环,您需要使用​​。

foreach my $name (sort ... ) { 

    # ... 

    $c++; 

    last if $c == 30; # break out of the loop when $c reaches 30 

} 

我用后缀变种if这里,因为这使得它的方式更容易阅读。还请注意,as zdim pointed out above,您应该在检查数字时使用数字相等性检查==eq用于字符串。

+0

伟大的人!非常感谢它现在的工作 –

+2

@DineshSharma请看[问]以了解当有人回答你的问题时该怎么做。 – simbabque

+0

当然,下次我会记住所有的事情! –