2

perlを使用して、メモリ内の大きな(BIG)ファイルを1行ずつ読み取る必要があります。エラーが発生した場合、関数open()はfalseと$を返します。システムエラーに設定されます。しかし、ファイルの読み取り中にエラーが発生した場合はどうなりますか?私はこのコードを使用します:

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

ヒントはありますか?

4

3 に答える 3

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);
于 2012-07-21T17:05:03.663 に答える
2

eofwhileループの後でテストすることをお勧めします。eofにいない場合は、エラーが発生します。または、おそらくより安全な方法として、$を確認してください。eof$!をリセットする可能性があるため。どちらの方法でもテストしてください。

また、read(2)でエラーが発生することは非常にまれです。おそらく、メモリが不足しています。

そして、もしあなたがメモリを使い果たしたとしても、perlはそれについてあなたに話す人ではなく、OSは(perlを殺すことによって!)そうするでしょう。

于 2012-07-21T16:38:32.603 に答える
2

エラーの場合、を返すwhileため、ループが中断します。ループ後の値をチェックして、すべてが正常かどうかを確認できるように設定する必要があります。<STATISTICS>undef$!$!

于 2012-07-21T16:40:31.057 に答える