2016-10-04 49 views
1

在这里,我想将每行中的数据打印为3个单独的值,并将“:”作为分隔符。该文件BatmanFile.txt的详细信息如下:如何从文件中获取每行的数据?

Bruce:Batman:[email protected] 
Santosh:Bhaskar:[email protected] 

而且我预计产量为:

Bruce 
Batman 
[email protected] 
Santosh 
Bhaskar 
[email protected] 

执行脚本后的产量为:

Bruce 
Batman 
[email protected] 
Bruce 
Batman 
[email protected] 

请给我解释一下我是什么在这里输入:

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; 

回答

3

当你这样做:

push(@resultarray, @linearray); 

你通过2@linearray@resultarray末,所以指数0还是从你第一次推@linearray的项目。

要覆盖@resultarray从第二次迭代的值,这样做:

@resultarray = @linearray; 

代替。

或者,使用unshift放置@linearray@resultarray开始,as suggested by Sobrique

unshift @resultarray, @linearray; 
+2

或美国'unshift'把它放在开头。 – Sobrique

+0

谢谢@Sobrique和Mathias。 – sbk

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:[email protected] 
Santosh:Bhaskar:[email protected] 

Demo


你能避免所有的变量,并完成类似下面

while(<DATA>){ 
    chomp; 
    print "$_\n" foreach split(":"); 
} 

一个内胆:

perl -e 'while(<>){chomp; push @result, split(":",$_);} print "$_\n" foreach @result' testdata.txt 
+0

谢谢Chankey。 – sbk

+1

不客气。顺便说一句,你可以轻松地避免所有的阵列操作。见编辑答案(第二部分)。 –

+0

感谢您对此的简要解释并为我提供了获得输出的最佳方法。但是,我需要这些变量来完成其他任务,所以我接受了另一个答案。并且非常感谢分享这些提示。 – sbk

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; 
+1

欢迎来到[so]!不接受代码的答案;一些解释会有帮助。 (有关更多信息,请参见[答案]。)关于代码本身,加入1项列表并不会为您带来非常有趣的结果。 –

相关问题