如何从文件中获取每行的数据?

时间:2016-10-04 13:08:10

标签: arrays perl

在这里,我希望将每行中的数据打印为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;

4 个答案:

答案 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

Demo

您可以避免所有变量并执行以下操作

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,因此02的索引仍然是您第一次推送@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;