2012-07-21 153 views
2

我必須使用perl逐行讀取內存中的大(BIG)文件。 如果出現一些錯誤,函數open()會返回false和$!設置爲系統錯誤。 但是,如果我得到一些錯誤閱讀該文件?我使用這個代碼:Perl讀取文件錯誤

open(STATISTICS, "<" . $statisticsFile) or die "Can't open statistics file $statisticsFile ($!)"; 
while (<STATISTICS>) { 
    my $line = $_; 
    ... 
} 
close($STATISTICS); 

任何提示?

+0

任何讀取錯誤:說完成讀取文件之前磁盤發生火災? – MarcoS 2012-07-21 16:37:30

+0

參見[perldoc -f readline](http://perldoc.perl.org/functions/readline.html):'while(!eof($ fh))定義的($ _ = <$fh>)或死於「readline失敗:$!「; ... }' – 2012-07-21 17:39:08

+0

您也可以在循環體內測試'$ filehandle-> error'。見IO :: Handle – DavidO 2012-07-21 17:42:37

回答

8

您可以將您的代碼更改爲如下所示。

您似乎將STATISTICS$STATISTICS用於您的文件句柄。由於詞彙句柄是可取的,我在這裏使用了$stat

open my $stat, "<" . $statisticsFile 
    or die "Can't open statistics file $statisticsFile: $!"; 

until (eof $stat) { 
    my $line = <$stat>; 
    defined $line or die "Read failure on statistics file $statisticsFile: $!"; 
    ... 
} 

close($stat); 
+0

是的,謝謝,我的錯誤!剛剛編輯的問題。你的答案是正確的,因爲如果你在閱讀文件時沒有測試eof *,你不會得到錯誤,循環也不會結束...... :-( – MarcoS 2012-07-21 17:26:33

+0

我的錯誤再次,對不起..循環甚至結束其他答案的行爲,但我更喜歡這種方法......它甚至不會更慢...... – MarcoS 2012-07-21 18:25:37

2

您可能需要在while循環後測試eof。如果你不在eof你有錯誤。或者,也許更安全,請檢查$!因爲eof 可能會重置$ !.以任何方式測試它。

我還會補充說,讀取(2)時出現錯誤非常罕見。也許你正在耗盡內存。

如果你的內存不足,perl不會是告訴你的,操作系統將會(通過殺死perl!)。

+0

謝謝。但是,我沒有(但)得到一個錯誤,我只是要求在安全的一面...... ;-) – MarcoS 2012-07-21 16:45:30

2

如果發生錯誤,while循環中斷,因爲<STATISTICS>返回undef$!應該設置,所以你可以檢查循環後的值$!,看看是否一切正常。