2017-05-28 117 views
-1

我嘗試學習Perl並遇到一些問題。我試圖覆蓋原始文件,但它沒有奏效。請幫幫我。如何覆蓋文件

#!/usr/bin/perl -w 

use diagnostics; 
use warnings; 
use strict; 

open (FILE, '>>apple.txt'); 
while (<FILE>){  
    s/is/at/; # Substitute 'is' for 'at' 
    print FILE; 
    close (FILE); 
} 

我想所有is改變at並將結果寫入到原始文件。

也許我錯過了什麼。

+0

歡迎StackOverflow上。 請參考[遊覽], 學習問好問題stackoverflow.com/help/how-to-ask, 做個[mcve]。 提供更多關於錯誤的信息,如何。即提供當前結果與期望的結果進行比較。 – Yunnosch

+1

你可能想要'/ g'修飾符。你也想打開你的文件閱讀。你用追加寫入模式'>>'打開它。你正在使用什麼樣的教程或書籍? – simbabque

+0

@simbabque我剛剛在網上找到一些教程。我曾經閱讀這本書,但對我沒有用處。 – Darentina

回答

4

如果你要花費任何時間在Perl編程時間,那麼花費時間閱讀Perl FAQ是非常值得的。第4節中回答的其中一個問題在這裏似乎很有用。

How do I change, delete, or insert a line in a file, or append to the beginning of a file?

答案開始是這樣的:

插入,更改或從文本 文件刪除線的基本思想包括閱讀和打印文件到您想要點 進行更改,進行更改,然後讀取並打印文件的其餘部分 。 Perl不提供對行的隨機訪問(尤其是 ,因爲記錄輸入分隔符$/是可變的),儘管模塊 (如Tie::File)可以僞造它。

一個Perl程序來完成這些任務需要打開一個文件, 打印其行,然後關閉 文件的基本形式:

open my $in, '<', $file  or die "Can't read old file: $!"; 
    open my $out, '>', "$file.new" or die "Can't write new file: $!"; 
    while(<$in>) { 
     print $out $_; 
    } 
    close $out; 

您當前的代碼幾點意見:

  • 您不需要-wuse warnings。大多數人只是使用後者。
  • 請使用open()的三參數版本和詞法文件句柄 - open my $file_handle, '>>', 'apple.txt'
  • 您應該始終檢查open()的返回值並採取適當的措施。通常人們使用die()這個 - open my $file_handle, '>>', 'apple.txt' or die "Can't open file: $!
0

Perl通常不支持直接訪問文件。 最好將更改的內容寫入臨時文件, 關閉輸入和輸出文件並將臨時文件重命名爲輸入。

或者,如果這是你想要做的唯一的事情,你可以使用一個 一個班輪命令,如:

perl -p -i -e "s/is/at/" -- apple.txt 

這的確大致相同。

或者,如果你非常想在自己的程序這一操作 ,則:

  • 訪問perldoc.perl.org/perlrun.html頁,
  • -i[extension]發現說明選項,
  • 後面的文字相當於您會找到相應的Perl代碼。

以及有關代碼中的一句話:

open (FILE, '>>apple.txt'); 

打開與當前位置指針文件在文件, 所以任何打印命令增加文本的結束,而不是從一開始就覆蓋文件 。

0

有一個名爲Tie::File能做的請求可能是模塊:

use Tie::File; 

my $inputFile = "test.txt"; 

my @array =(); 
tie @array, 'Tie::File', $inputFile || die "Error: Couldn't tie the \"$inputFile\" file: $!"; 
my $len = join "\n", @array; 

if($len=~m/is/) { $len=~s/is/at/g; } 

@array = split/\n/, $len; 
untie @array;