2017-09-24 50 views
2
cat -E test1.txt 

輸出:Perl的文件句柄 - 覆蓋現有數據,而不是追加/刪除

car$ 
$ 
$ 

我只想改變「車」和「自行車」,並刪除新的/空行。

這是按預期工作:

#!/usr/bin/perl -w 
open(FILE1,"<","./test1.txt"); @araj=<FILE1>; close(FILE1); 
open(FILE2,">","./test1.txt"); 
map { 
[email protected]@[email protected]; [email protected]^\[email protected]@; 
} @araj; 
print(FILE2 @araj); 
close(FILE2); 

cat -E test1.txt 

輸出爲100對我來說%正確:

​​

但在上述情況下,我用2個開啓/關閉文件。 所以我使用2個文件句柄。
我只想使用1x文件句柄
(這是學習目的,只是想了解+ + + >>正在工作......)。
例如:

#!/usr/bin/perl -w 
open(FILE2,"+<","./test1.txt"); #what file handle should be here? +> , +>> >> .... ? 
@araj=<FILE2>; 
map { 
[email protected]@[email protected]; [email protected]^\[email protected]@; 
} @araj; 
print(FILE2 @araj); 
close(FILE2); 

輸出不正確:

car$ 
$ 
$ 
bike$ 

這是爲什麼追加,但沒有覆蓋?當我使用其他文件句柄時,結果也是不正確的,例如空文件... 哪個文件句柄用於讀取和覆蓋?

+0

https://perldoc.perl.org/functions/seek.html –

+0

@ikegami感謝文件。糾正。 – collector1871

回答

2

這是爲什麼追加,但沒有覆蓋?

您首先讀取所有數據直到文件結束。這意味着下一次讀取或寫入的文件位置現在位於您讀取的所有數據之後,即文件末尾。如果你想從文件的開頭寫入數據,您需要使用seek更改文件位置:

seek($filehandle,0,0); # position at beginning of file 

你寫會再開始這個新的文件中的位置從一開始寫的,即下一個數據的文件。一旦你完成,你可能需要使用truncate與你同tell了當前文件位置從文件中刪除當前文件位置後的任何數據:

truncate($filehandle, tell($filehandle)); 

或者,整個程序:

use strict; 
use warnings; 
open(my $fh, "+<", "./test1.txt"); 
my @araj = <$fh>; 
for(@araj) { 
    s{car}{bike}; 
    s{^\n}{}; 
} 
seek($fh, 0, 0);   # seek at the beginning of the file 
print $fh @araj; 
truncate($fh, tell($fh)); # remove everything after current file position 
close($fh); 
+0

謝謝,對我很好的回答 – collector1871

1

在閱讀中排列文件文件句柄位置是該文件的末尾。 那麼你應該通過seek功能perldoc seek(在文件開頭設置)更改文件句柄位置。 下一步調整您truncateperldoc truncate

#!/usr/bin/perl -w 
open(FILE2,"+<","./test1.txt"); #what file handle should be here? +> , +>> >> .... ? 
@araj=<FILE2>; 
map { 
[email protected]@[email protected]; [email protected]^\[email protected]@; 
} @araj; 

seek(FILE2, 0, 0); 
print(FILE2 @araj); 
truncate(FILE2, tell(FILE2)); 

close(FILE2); 
+0

謝謝,它的工作(這也是很好的答案) – collector1871