2

我必须使用 perl 逐行读取内存中的一个大(BIG)文件。如果出现错误,函数 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

您可能想eof在 while 循环之后进行测试。如果你不在 eof 你有一个错误。或者,可能更安全,检查 $!因为 eof可能会重置 $!。无论哪种方式都可以测试。

我还要补充一点,在 read(2) 上出现错误是非常罕见的。也许您的内存不足。

如果你确实用完了内存,perl 不会告诉你它,操作系统会(通过杀死 perl!)。

于 2012-07-21T16:38:32.603 回答
2

如果出现错误,循环会因为返回而while中断。应该设置,所以你可以检查循环后的值,看看是否一切正常。<STATISTICS>undef$!$!

于 2012-07-21T16:40:31.057 回答