我有一些代码附加到嵌套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”被附加到文件的中间!
我如何解决这个问题?
答案 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
字段。
因此,如果您在查看时发现自己的数据没有显示在最后,那么另一个代理程序之后会向其写入更多数据。