4

这段代码:

foreach my $file (@data_files) {

    open my $fh, '<', $file || croak "Could not open file $file!\n";
    my @records = <$fh>;
    close $fh;

    ....

}

产生此错误:

readline() on closed filehandle $fh at nut_init_insert.pl line 29.

我不知道为什么。

编辑:原始帖子在open声明中使用“,”而不是“<”。

4

2 回答 2

11

您发布的代码中有错字(第二个 arg 到open),但这并不能解释错误消息。该问题的消息是这样的:

Unknown open() mode ',' at ...

您的问题与优先级有关。||绑定太紧,导致 Perl 将整个表达式视为打开的第三个参数:

$file || croak $!

结果,即使open失败(可能是因为$file不是一个有效的文件名),croak也不会被执行(因为$file是真的而且||短路了)。失败后open,您的程序会尝试从未打开的文件句柄中读取一些行,并且您会收到以下错误消息:

readline() on closed filehandle $fh at ...

您想改用以下方法之一。第二个选项有效(与您的代码不同),因为or优先级较低。

open(my $fh, '<', $file) || croak ...;

open my $fh, '<', $file or croak ...;

有关运算符优先级的详细信息,请参阅perlop。在您的情况下,相关点是||运算符的优先级高于列表分隔符(逗号)。

于 2010-04-24T13:39:44.077 回答
1

打开的第二个参数中有一个错字:

open my $fh, '<', $file || croak "Could not open file $file!\n";
于 2010-04-24T12:53:35.110 回答