gpt4 book ai didi

perl - 为什么在 Perl 的列表上下文中使用菱形运算符时出现关闭的文件句柄错误?

转载 作者:行者123 更新时间:2023-12-03 18:28:08 24 4
gpt4 key购买 nike

这段代码:

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 中有 ',' 而不是 '<'陈述。

最佳答案

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

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

您的问题与优先级有关。 ||绑定(bind)得太紧,导致 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 .您的案例中的相关点是 ||运算符的优先级高于列表分隔符(逗号)。

关于perl - 为什么在 Perl 的列表上下文中使用菱形运算符时出现关闭的文件句柄错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2704487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com