在这里,我希望将每行中的数据打印为3个单独的值,使用" :
"作为分隔符。文件BatmanFile.txt
具有以下详细信息:
Bruce:Batman:bat@bat.com
Santosh:Bhaskar:santosh@santosh.com
我预期的输出是:
Bruce
Batman
bat@bat.com
Santosh
Bhaskar
santosh@santosh.com
执行脚本后的输出是:
Bruce
Batman
bat@bat.com
Bruce
Batman
bat@bat.com
请解释我在这里缺少的东西:
use strict;
use warnings;
my $file = 'BatmanFile.txt';
open my $info, $file or die "Could not open $file: $!";
my @resultarray;
while( my $line = <$info>) {
#print $line;
chomp $line;
my @linearray = split(":", $line);
push(@resultarray, @linearray);
print join("\n",$resultarray[0]),"\n";
print join("\n",$resultarray[1]),"\n";
print join("\n",$resultarray[2]),"\n";
}
close $info;
答案 0 :(得分:5)
您逐行循环浏览文件。您已将所有行(分割后)存储在数组中。一旦循环结束,你就拥有resultarray
数组中的所有数据,只需在循环后打印整个数组(而不是只打印你当前正在做的前3个索引)。
#!/usr/bin/perl
use strict;
use warnings;
my @resultarray;
while( my $line = <DATA>){
chomp $line;
my @linearray = split(":", $line);
push @resultarray, @linearray;
}
print "$_\n" foreach @resultarray;
__DATA__
Bruce:Batman:bat@bat.com
Santosh:Bhaskar:santosh@santosh.com
您可以避免所有变量并执行以下操作
while(<DATA>){
chomp;
print "$_\n" foreach split(":");
}
一个班轮:
perl -e 'while(<>){chomp; push @result, split(":",$_);} print "$_\n" foreach @result' testdata.txt
答案 1 :(得分:3)
当你这样做时:
push(@resultarray, @linearray);
您最后将@linearray
推送到@resultarray
,因此0
到2
的索引仍然是您第一次推送@linearray
时的项目
要使用第二次迭代中的值覆盖@resultarray
,请执行:
@resultarray = @linearray;
代替。
或者,使用unshift
将@linearray
放在@resultarray
的开头,as suggested by Sobrique:
unshift @resultarray, @linearray;
答案 2 :(得分:2)
那么,你只想transliterate :
到\n
?
$ perl -pe 'tr/:/\n/' data.txt
输出:
Bruce
Batman
bat@bat.com
Santosh
Bhaskar
santosh@santosh.com
答案 3 :(得分:1)
use strict;
use warnings;
my $file = 'BatmanFile.txt';
open my $info, $file or die "Could not open $file: $!";
my @resultarray;
while( my $line = <$info>) {
#print $line;
chomp $line;
my @linearray = split(":", $line);
#push(@resultarray, @linearray);
print join("\n",$linearray[0]),"\n";
print join("\n",$linearray[1]),"\n";
print join("\n",$linearray[2]),"\n";
}
close $info;