为什么我在Perl中的关闭文件句柄上得到错误print()

时间:2015-04-21 06:10:10

标签: perl input output

我正在尝试将输出写入一个C文件,但我收到有关print() on closed filehandle的错误。

my $fileoutput="output.c";
open OUTFILE, "> $fileoutput" or die $!;
for my $i (keys%hash) {
    # grep for c file output and compare
    # with xml key print both key and values
    if (grep $_ eq $i,@c_result_array) {
        if (defined $hash{$i}) {
            my @values = $hash{$i};
            print OUTFILE $i . "=> @values";
            print OUTFILE "\n";
        }

        close OUTFILE;
    }
}

1 个答案:

答案 0 :(得分:3)

关闭for循环内的输出文件。到第二次迭代时,文件句柄已经关闭。循环运行完成后,您必须关闭文件。

此外,裸字文件句柄具有包范围,它具有全局变量的所有缺点。使用词汇文件句柄。

此外,特别是如果您要打开的文件的名称来自外部,请使用open的三个参数形式,并始终在错误消息中包含该文件的名称。

最后,假设$hash{$i}包含数组引用,因此如果要将其内容插入到字符串中,则必须取消引用它。

my $fileoutput = "output.c";
open my $OUTFILE, '>', $fileoutput
    or die "Failed to open '$fileoutput': $!";

for my $i (keys %hash) {
   #grep for c file output and compare with xml key print both key and values #
   if (grep $_ eq $i, @c_result_array) {
      if(defined $hash{$i}) {
            my @values = @{ $hash{$i} };
            print $OUTFILE "$i => @values\n";
       }
   }
}
close $OUTFILE
    or die "Failed to close '$fileoutput': $!";