perl附加问题

时间:2011-05-04 12:36:07

标签: perl

我有一些代码附加到嵌套for循环中的某些文件中。退出for循环后,我想将.end附加到所有文件。

foreach my $file (@SPICE_FILES)
{
    open(FILE1, ">>$file") or die "[ERROR $0] cannot append to file : $file\n";
    print FILE1 "\n.end\n";
    close FILE1; 
}

在一些奇怪的情况下,我注意到“.end”被附加到文件的中间!

我如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

由于我还没有评论特权,所以我必须将其写成'答案'。

你使用任何狡猾的模块吗?

我遇到了一些问题,其中(显然)破坏了perl-modules对输出缓冲做了某些事情。对我来说

$| = 1;

在代码中有所帮助。上面的语句关闭了perls输出缓冲(AFAIK)。它可能也有其他影响,但我没有看到任何负面影响。

答案 1 :(得分:1)

我猜你在以前打开过的文件描述符中已经缓存了数据。在重新打开之前尝试关闭它们:

open my $fd, ">>", $file or die "Can't open $file: $!"; 
print $fd, $data;
close $fd or die "Can't close: $!";

更好的是,您可以将这些文件添加到数组/哈希并在清理中写入它们:

push @handles, $fd;
# later
print $_ "\n.end\n" for @handles; 

这是一个重现中间“不可能”追加的案例:

 #!/usr/bin/perl -w
 use strict;

 my $file = "file";

 open my $fd, ">>", $file;
 print $fd "begin"; # no \n -- write buffered

 open my $fd2, ">>", $file;
 print $fd2 "\nend\n";
 close $fd2; # file flushed on close

 # program ends here -- $fd finally closed
 # you're left with "end\nbegin"

答案 2 :(得分:0)

无法在文件中间附加内容。 O_APPEND标志保证每个 write (2)系统调用将其内容放在旧的EOF中,并通过将您刚写入的字节数增加来更新st_size字段。

因此,如果您在查看时发现自己的数据没有显示在最后,那么另一个代理程序之后会向其写入更多数据。