为什么在Perl的列表上下文中使用菱形运算符时会出现关闭的filehandle错误?

为什么在Perl的列表上下文中使用菱形运算符时会出现关闭的filehandle错误?,perl,diamond-operator,Perl,Diamond Operator,此代码: foreach my $file (@data_files) { open my $fh, '<', $file || croak "Could not open file $file!\n"; my @records = <$fh>; close $fh; .... } 我不知道为什么 编辑:原始帖子有“,”而不是“要打开的第二个参数中有一个输入错误: open my $fh, '<', $file || croak "

此代码:

foreach my $file (@data_files) {

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

    ....

}
我不知道为什么


编辑:原始帖子有“,”而不是“要打开的第二个参数中有一个输入错误:

open my $fh, '<', $file || croak "Could not open file $file!\n";
$file || croak $!

打开我的$fh,您发布的代码中有一个输入错误(第二个参数是
打开
),但这并不能解释错误消息。该问题的信息如下:

Unknown open() mode ',' at ...
你的问题与优先权有关。
|
绑定太紧,导致Perl将整个表达式视为要打开的第三个参数:

open my $fh, '<', $file || croak "Could not open file $file!\n";
$file || croak $!
因此,即使
open
失败(可能是因为
$file
不是有效的文件名),
croak
也不会执行(因为
$file
为真且
|
短路)。打开
失败后,您的程序尝试从未打开的文件句柄中读取一些行,您会收到以下错误消息:

readline() on closed filehandle $fh at ...
您希望使用以下选项之一。第二个选项起作用(与您的代码不同),因为
的优先级较低

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

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

open(my$fh,'总是创建一个最小但完整的程序,并向我们展示真实的代码。否则,你会浪费人们的时间来解决你实际上没有的问题。代码片段符合你的标准。错误会发生。FM给出了一个很好的答案,我学到了一些关于优先级的知识。赢吧。