【问题标题】:Why am I getting a closed filehandle error when using the diamond operator in list context in Perl?为什么在 Perl 的列表上下文中使用菱形运算符时出现关闭的文件句柄错误?
【发布时间】:2010-04-24 12:43:55
【问题描述】:

这段代码:

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 语句中使用“,”而不是“

【问题讨论】:

    标签: perl diamond-operator


    【解决方案1】:

    您发布的代码中有错字(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。在您的情况下,相关点是 || 运算符的优先级高于列表分隔符(逗号)。

    【讨论】:

      【解决方案2】:

      open 的第二个参数有错字:

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

      【讨论】:

      • Aways 创建一个最小但完整的程序并向我们展示真实的代码。否则,你会浪费人们的时间来解决你实际上没有的问题。
      • sn-p 符合您的条件。错误发生。 FM给出了一个很好的答案,我学到了一些关于优先级的东西。双赢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 2011-08-16
      • 2010-12-07
      • 2012-01-24
      相关资源
      最近更新 更多