perl变量不在块外存储数据

时间:2017-04-14 07:41:28

标签: perl

我在下面写了提及代码来读取文件并将数据存储到数组@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

1 个答案:

答案 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用于字符串。