2011-04-06 40 views
0

對不起,如果這個問題聽起來很愚蠢,但我已經搜尋了很多,到現在爲止,我正在一天的一小部分工作中完成一項相當簡單的任務。我可以使用搜索和替換在Perl中插入累進數字嗎?

我需要將漸進編號的ID插入到文本文件中。該文件中已有佔位符,因此我傾向於使用搜索和替換。我能做的最好的是以下幾點:

#!/usr/bin/perl 
my $counter = 1; 
my $oldID = "docID=\""; 
my $newID = "docID=\"14$counter"; #should the return the IDs 141, 142, 143 ... 

open (FILE, "file.txt") || die $!; 
@content = <FILE>; 

foreach (@content){ 
s/$oldID/$newID/; 
$counter++; 
} 

open (OUT, ">file_ID.txt") || die $!; 
print OUT @content; 
close OUT; 
close(FILE); 

print = "$counter" #this is to test if the counter is working. 

這找到並替換了docID =「」。令人遺憾的是,它用141替換了docID的所有出現。

我會認爲它不起作用,因爲所有的事件一次被全部替換,並且計數器從來沒有機會變大。然而,如果我看到$ counter增長過大,這看起來不太合理。它正好是docID發生次數的12倍。

我相信我需要的Perl只更換一個的docID的出現時再擡高計數器,然後做一個循環,直到文件的結尾。

誰能幫助我嗎?我將非常感激

THX

尤利烏斯

回答

3
open my $in, '<', 'file.txt' or die "$! opening input"; 
open my $out, '>', 'file_ID.txt' or die "$! opening output"; 

my $counter = 141; 

while (<$in>) { 
    s/docID="/q{docID="} . $counter++ /eg; 
    print $out $_; 
} 

用途s///e更換和增加的情況下,發現櫃檯上,並通過行處理文件-line而不是讀取所有到內存中並重新寫它都回來了,因爲沒有真正的理由這樣做。

+1

它的工作,非常感謝! :) – Iulius 2011-04-06 22:28:51

2

Perl的正則表達式的支持 「EVAL」 這樣,你可以這樣做:

s/$oldId/"docid=\"" . $newId++ . "\""/e 

其中/ E是evals更換EVAL部分每個電話。

1

在你的代碼,你可以移動$ NEWID變量中的for循環:

foreach (@content){ 
    my $newID = "docID=\"14$counter"; 
    s/$oldID/$newID/; 
    $counter++; 
} 
相關問題