2011-05-04 84 views
0

我有一些代碼附加到嵌套for循環中的某些文件。退出for循環後,我想將.end追加到所有文件。perl附加問題

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

您確定在添加「.end」部分後,您沒有寫入另一個進程中的文件嗎?隨着代碼的寫入,您所描述的內容絕對不會發生。 – geoffspear 2011-05-04 12:37:56

+0

這對我來說工作得很好。是@SPICE_FILES的唯一內容,您是否正在編寫「.end」以外的任何內容? – Arunmu 2011-05-04 12:45:43

+0

你在做什麼平臺? – crazyscot 2011-05-04 12:57:23

回答

3

由於我還沒有評論 - 特權,我必須將其寫爲'答案'。

你使用任何可怕的模塊?

我遇到了問題,很明顯,perl模塊已經完成了到輸出緩衝。對我來說

$| = 1; 

在代碼中有幫助。上面的語句關閉了perls輸出緩衝(AFAIK)。它可能也有其他影響,但我沒有看到任何消極影響。

+0

有趣的東西與輸出緩衝 – Gordon 2011-05-04 14:07:57

+0

是的你是對的。 $ | = 1會關閉緩衝,如果我沒有記錯的話,就叫做熱文件句柄:) – Arunmu 2011-05-04 15:02:47

0

這是不可能追加到文件的中間的東西。 O_APPEND標誌保證每個寫入(2)系統調用將把它的內容放在舊的EOF中並通過增加它來更新st_size字段,不管你剛剛寫了多少字節。

因此,如果您發現自己的數據在最後看不到時會顯示出來,那麼另一個代理會在後面寫入更多數據。

1

我想你已經在一些以前打開的文件描述符中緩衝了數據。嘗試重新打開之前關閉它們:

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

更重要的是,你可以添加這些filehanles到一個數組/哈希和寫入他們在清理:

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" 
+0

正如@Christopher所說,你可以通過開啓和關閉'$ |'來輕鬆發現問題是否真的存在。 – Dallaylaen 2011-05-04 12:55:52

+2

即使在只讀句柄上,也不要信任自動關閉:它因爲不測試和報告錯誤而中斷。總是明確測試close($ fh)||死「無法關閉:$!」'。 – tchrist 2011-05-04 13:00:14

+0

@tchrist:好點。 – Dallaylaen 2011-05-04 13:05:08