2012-09-03 58 views
0

我有一個文件處理程序的文件,我正在尋找匹配的行,並用一個新行替換匹配。替換線路發生在子程序中。替換文件中的一行代替它下面的行。 Perl

sub replace{ 
    seek(FILE,0,0); 
    while(my $line= <FILE>){ 
     if($line =~ m/SOMEMATCH/){ 
      $line=~ s/SOMEMATCH/REPLACEMENT/; 
      print FILE $line; 
     } 
    } 
} 

當我打印調用&代替我發現錯了行改爲打完文件:

Line 1 
Line 2 
Line 3 
SOMEMATCH 
Line 4 
Line 5 

變爲:

Line 1 
Line 2 
Line 3 
SOMEMATCH 
REPLACEMENT 
Line 5 

這是怎麼回事?我如何解決它?

+0

你是不是忘記尾隨/或只是一個錯字? – squiguy

+0

@squiguy固定的,是的,它是一個錯字 – MinaHany

+0

領帶::文件也是一個不錯的模塊,看看能否在線編輯。 – squiguy

回答

2

我不認爲你可以在一個文本文件中讀取和替換它的部分 - 在地方 - 與那些或長或短的字符串,並得到你想要的結果。必須用較長的新字符串覆蓋某些數據,否則如果字符串較短,則會留下「空洞」。如果字符串長度相同,則邏輯仍然存在問題 - 替換字符串將需要您備份,因爲在讀取它之後,您已經過了要替換的字符串。在這一點上寫入替換應該覆蓋下一行,因爲這是文件「指針」當前設置爲準備讀取下一行的位置。

我覺得這樣的事情最好由具有單獨的輸出文件來完成。讀一個,寫另一個,如有必要,刪除第一個,重命名第二個。

或者你可以將整個文件讀入一個數組,使您的字符串替換,關閉並重新打開過書面文件,數組寫回文件,並關閉文件。

+0

你是正確的覆蓋和「漏洞」確實發生。 除了單獨的輸出文件之外,還有其他方法可以做到這一點嗎? – MinaHany

+0

您可以將整個文件讀入內存中的一個數組中,替換字符串,然後將其寫回到開頭的同一個文件中。 – Scooter

+0

啊當然!讀入數組是完美的。謝謝。 – MinaHany