我必须使用perl逐行读取内存中的大(BIG)文件。 如果出现一些错误,函数open()会返回false和$!设置为系统错误。 但是,如果我得到一些读取文件的错误? 我使用这段代码:
open(STATISTICS, "<" . $statisticsFile) or die "Can't open statistics file $statisticsFile ($!)";
while (<STATISTICS>) {
my $line = $_;
...
}
close($STATISTICS);
任何提示?
答案 0 :(得分: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);
答案 1 :(得分:2)
您可能希望在while循环后测试eof
。如果您不在eof,则表示您有错误。或者,可能更安全,检查$!因为eof 可能重置$!。无论哪种方式测试。
我还要补充说,在read(2)上获取错误非常罕见。也许你的内存不足了。
如果你的内存耗尽,perl就不会是那个告诉你它的人,操作系统会去(通过杀死perl!)。
答案 2 :(得分:2)
如果出现错误,while
循环会中断,因为<STATISTICS>
会返回undef
。应设置$!
,因此您可以在循环后检查$!
的值,看看是否一切正常。