2017-04-14 21 views
0

ファイルを読み込んでデータを格納するために、以下のコードを記述しました。@s_arrブロック外のデータを格納していないperl変数

ブロック外にその@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'と等しくなるので、プログラムは静かに 'exit'sですか? (Btwはそこで '=='を使うべきです) – zdim

答えて

4

あなたforeachループの内部exitを呼んでいます。そのため、プログラムは停止し、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あなたの質問に誰かが答えたときに何をすべきかを知るには[ask]をご覧ください。 – simbabque

+0

次回はすべてのことを念頭に置いていきます! –

関連する問題