2011-04-06 43 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++; 
} 
相关问题