即使在perl中循环时声明外部也无法访问数组

时间:2017-05-03 16:24:45

标签: arrays perl csv

我正在尝试读取CVS文件以获取其中的第2和第3列。我在while循环之外声明了空数组@x_ax@dat。我使用@x_ax存储第二列,@dat存储第三列CSV文件。 @x_ax@dat的内容仅在循环内打印,但不在外部。

下面是我的代码和输出。

#!/usr/bin/perl
use strict;

my @arr=();
my @x_ax=();
my @dat=();
open(FH,"new1.csv") || die "Not able to open new1.csv file $!\n";

while( my $line=<FH>)
{
        if ($line =~ m/Time/)
        {
                exit 0;
        }
        else
        {
                @arr=split(/,/,$line);
                #print "@arr[1]\n";
                push(@x_ax,$arr[1]);
                print "@x_ax \n";
                push(@dat,$arr[2]);
        }
}

print @x_ax;
print "$#x_ax and $#dat \n";

[root@localhost perl_practice]# perl test.pl 
AX_1 
AX_1 SAL 
AX_1 SAL BAS 
AX_1 SAL BAS OPT 
AX_1 SAL BAS OPT LES 
AX_1 SAL BAS OPT LES MSS

以下是我的CSV文件内容

17:00:01,AX_1,0,0,0,0,0
17:00:01,SAL,0,0,0,0,0
17:00:01,BAS,0,0,0,0,0
16:55:02,OPT,0,0,0,0,0
17:00:01,LES,0,0,0,0,0
16:55:02,MSS,0,0,0,0,0
Time,info,dat1,dat2,dat3,dat4,dat5

如何在循环外访问@x_ax@dat

1 个答案:

答案 0 :(得分:3)

并不是你不能在阵列外访问它们,问题是你的程序永远不会到达那些最后的打印语句。你有:

if ($line =~ m/Time/)
{
    exit 0;
}

您的CSV的最后一行有Time,程序会在到达最终打印件之前退出。

如果您的if语句仅用于停止循环,则可以使用last。然后也不需要else本身,成为更常见的循环习语:

while( my $line=<FH>)
{
    last if ($line =~ m/Time/);

    @arr = split(/,/,$line);
    #print "@arr[1]\n";
    push(@x_ax,$arr[1]);
    print "@x_ax \n";
    push(@dat,$arr[2]);
}