2010-07-26 72 views
1

對於同一個文件,可能有兩個文件句柄嗎?perl中同一個文件的兩個文件句柄

open TXT,"+>","New" or die "Cannot Create File \n"; 
print TXT "Line1 \n"; 
open TXT1, ">>New" or die "Cannot open file"; 
print TXT1 "Line2 \n"; 

這項工作?

+3

正如那句老話:「當你嘗試它時發生了什麼? – hobbs 2010-07-26 10:49:05

+0

是的..它工作。感謝所有.. – Raj 2010-07-28 12:55:42

回答

1

,對同一文件可能有多個文件處理程序。 這將工作。

use strict; 
    use warning; 
    my $path = 'testfile'; 
    open TXT,"+>",$path or die "Cannot Create File \n"; 
    printf TXT "Line1\n"; 

    open TXT1, ">>",$path or die "Cannot open file"; 
    printf TXT1 "Line2\n" ; 
    close TXT; 
    close TXT1; 
3

是的,它會工作。對同一個文件有幾個句柄是可以的。

但請注意,您的第一個文件處於覆蓋模式。 TXT1將始終在文件末尾寫入,但TXT將保留在其以前的位置並根據緩衝區重寫所有內容。

如果你這樣做:

print TXT "Line 1\n"; 
print TXT1 "Line 2\n"; 
print TXT "Line 3\n"; 
close TXT; 
close TXT1; 

您將有:

Line 1 
Line 3 
Line 2 

,但如果你這樣做:

print TXT "Line 1\n"; 
print TXT1 "Line 2\n"; 
close TXT1; # this writes the buffer to disk 
print TXT "Line 3\n"; 
close TXT; 

您將有:

Line 1 
Line 3 

第2行被寫入,然後被第3行覆蓋。在第一種情況下,第3行位於緩衝區中,第2行被寫入,因爲文件首先關閉,然後第3行寫入追加。

所以,小心使用!

1

是的,可以爲同一個文件打開多個句柄,但(1)結果可能不是你想要的(見下文),(2)你是否真的需要這樣做,或者有更好的如何解決你的大問題?

這就是說,這裏就是一個小實驗發現我的Windows機器上:在寫模式

打開一個文件,追加模式一個文件:

my $file_name = 'text_write_append.txt'; 
open(my $fh1, ">", $file_name) or die $!; 
open(my $fh2, ">>", $file_name) or die $!; 

print $fh1 "foo\n" x 1; 
print $fh2 "bar\n" x 2; 
print $fh1 "x"; 

第二寫$fh1選秀權在先前的寫入停止的地方,跺倒第一個bar並截斷第二個。可能不是你想要的。

foo 
xar 

打開追加模式這兩個文件。

my $file_name = 'text_append_append.txt'; 
open(my $fh0, ">", $file_name) or die $!; close $fh0; # Create empty file. 
open(my $fh1, ">>", $file_name) or die $!; 
open(my $fh2, ">>", $file_name) or die $!; 

print $fh1 "foo\n" x 1; 
print $fh2 "bar\n" x 2; 
print $fh1 "x"; 

我們所有的輸出都存在,但順序錯誤。

bar 
bar 
foo 
x 

開啓在附加模式這兩個文件,無需緩衝輸出

my $file_name = 'text_append_append_flush.txt'; 
open(my $fh0, ">", $file_name) or die $!; close $fh0; 
open(my $fh1, ">>", $file_name) or die $!; select $fh1; $| = 1; # No buffering. 
open(my $fh2, ">>", $file_name) or die $!; select $fh2; $| = 1; 

print $fh1 "foo\n" x 1; 
print $fh2 "bar\n" x 2; 
print $fh1 "x"; 

可能是您期望的(但請注意,無緩衝寫入通常比緩衝寫入更慢)。

foo 
bar 
bar 
x 
相關問題