2013-03-04 102 views
2

請考慮以下代碼,其中test2.txt包含文本Text2(和尾隨換行符)。使用「File :: Copy」輸出重新排序

use File::Copy; 

open (my $fh, "|-", "cat"); 
print $fh "Test1\n"; 

copy("test2.txt", $fh); 

close $fh; 

我預計這將打印:

Test1 
Test2 

但是,下面的正印:

Test2 
Test1 

爲什麼會發生這種情況,以及如何解決它?

+1

打開autoflush(IIRC它是'$ | = 1'),看看會發生什麼。 – 2013-03-04 07:54:57

+0

我想這可能會有所幫助,但即使這樣做,我也不確定這是否因爲我幸運。我不希望程序在開發/測試系統上工作,然後由於某些受到負載影響的緩衝問題而導致生產失敗。 – Clinton 2013-03-04 07:57:17

+0

我懷疑發生的事情是,兩個輸出機制使用不同的緩衝區集合,並且關閉'close $ fh'的自動刷新先沖洗,然後在關閉時刷新'cat'進程。 – 2013-03-04 07:58:35

回答

1

您正在混合緩衝IO和非緩衝IO,從來就不是一個好主意。 (文件::複製使用sysread執行/ SYSWRITE以及兩者之間它自己的緩衝區。)

你好得多隻是在做:

use File::Slurp 'read_file'; 

print $fh read_file('test2.txt'); 

,雖然我不知道爲什麼你是管道貓,如果你真的希望這被緩衝。

+0

謝謝,雖然我的解決方案是用'syswrite'替換上面的'print'。 – Clinton 2013-03-04 23:23:15

+0

這也可以工作:) – ysth 2013-03-05 00:57:51