为什么在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给出了一个很好的答案,我学到了一些关于优先级的知识。赢吧。