2016-10-04 64 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項列表並不會爲您帶來非常有趣的結果。 –

相關問題