2014-01-22 31 views
0

database.Win.txt是一個包含3行倍數的文件。每三行中的第二行是一個數字。該代碼應該打印出三行(按新順序)在一行中由製表符分隔,但只有在第二行是1時才行。在perl中正確使用輸入文件?

我是通過此代碼實際獲取循環來創建數組有三行database.Win.txt每次它通過循環運行?這是我的目標,但我懷疑這不是代碼所做的,因爲我得到一個錯誤,說int()函數需要一個數值,並且沒有找到。

while(<database.Win.txt>){ 
    $new_entry[0] = <database.Win.txt>; 
    $new_entry[1] = <database.Win.txt>; 
    $new_entry[2] = <database.Win.txt>; 
    if(int($new_entry[1]) == 1) { 
     chomp($new_entry); 
     print "$new_entry[1], \t $new_entry[2], \t $new_entry[0], \n" 
    } 
} 

我是一個初學Perl的人。請儘可能簡單地解釋!

回答

0

我覺得你在這個解決方案上有一個好的開始。但是,您的while在讀取下三行之前讀取一行(如果這些行是<$file_handles>)。 int不是必需的,但chomp是 - 在檢查$new_entry[1]的值之前,否則在最後仍然有記錄分隔符。

鑑於此,考慮以下因素:

use strict; 
use warnings; 

my @entries; 
open my $fh, '<', 'database.Win.txt' or die $!; 

while (1) { 
    last if eof $fh; 
    chomp($entries[$_] = <$fh>) for 0 .. 2; 

    if ($entries[1] == 1) { 
     print +(join "\t", @entries), "\n"; 
    } 
} 

close $fh; 

始終以use strict; use warnings開始。接下來,使用openthree-argument form打開文件。在此使用A while (1),因此一次可以在while循環內讀取三行。由於這是一個'無限的'while循環,last if eof $fh;給出了一個出路,即如果下一個文件讀取產生文件結尾,它是last。正下方是一個for循環,它有效地做了你所做的事:將一個文件行分配給一個數組位置。請注意,chomp用於在分配過程中刪除記錄分隔符。最後一部分也與您的相似,因爲它檢查三行中的第二行是否爲1,然後如果是這樣,則打印該行。

希望這會有所幫助!

相關問題