我正在尝试读取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
?
答案 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]);
}