我可以使用搜索和替换在Perl中插入渐进式数字吗?

时间:2011-04-06 21:41:49

标签: perl replace

我很抱歉,如果这个问题听起来很愚蠢,但我已经搜索了很多,而且到目前为止,我正在为一天的大部分工作做一个相当简单的工作。

我需要将逐步编号的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 个答案:

答案 0 :(得分: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替换并在找到实例时递增计数器,并逐行处理文件而不是将其全部读入内存并将其全部重新写回来,因为没有真正的理由那样做。

答案 1 :(得分:2)

perl regexps支持“eval”,你可以这样做:

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

其中/ e是每次调用都会导致替换的eval部分。

答案 2 :(得分:1)

在你的代码中,你可以在for循环中移动$ newID变量:

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