我可以使用search和replace在Perl中插入累进数吗?

我可以使用search和replace在Perl中插入累进数吗?,perl,replace,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 ...

我很抱歉,如果这个问题听起来很愚蠢的话,但是我已经搜索了很多,到现在为止,我一天中大部分时间都在做一件相当琐碎的工作

我需要将递增编号的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.
#/usr/bin/perl
我的$counter=1;
我的$oldID=“docID=\”;
my$newID=“docID=\”14$counter”#如果返回ID 141142143。。。
打开(文件,“FILE.txt”)| | die$!;
@内容=;
foreach(@content){
s/$oldID/$newID/;
$counter++;
}
打开(OUT,“>file_ID.txt”)| | die$!;
打印内容;
收尾;
关闭(文件);
print=“$counter”#用于测试计数器是否工作。
这将查找并替换docID=“”。不幸的是,它用141取代了docID的所有出现

我想这是行不通的,因为所有发生的事情都被一次替换掉了,计数器永远也没有机会变大。然而,如果我看到$counter增长过大,这看起来就不太可能了。这正好是docID发生次数的12倍

我相信我需要让perl只替换docID的一次出现,然后提高计数器,然后在循环中执行此操作,直到文档结束

谁能帮我一下吗?我将非常感激

Thx

Iulius

perl regexp支持“eval”,您可以执行以下操作:

s/$oldId/"docid=\"" . $newId++ . "\""/e
其中/e是每次调用都对替换进行eval的eval部分。

perl regexps支持“eval”,因此您可以执行以下操作:

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

其中/e是每次调用都对替换进行求值的求值部分。

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

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

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

foreach (@content){
    my $newID = "docID=\"14$counter";
    s/$oldID/$newID/;
    $counter++;
}
打开我的$in'、'file_ID.txt'或死“$!opening output”;
我的$counter=141;
而(){
s/docID=“/q{docID=“}.$counter++/eg;
打印$out$;
}
使用
s///e
在找到实例时替换并递增计数器,并逐行处理文件,而不是将其全部读入内存并重新写入,因为没有真正的理由这样做。

打开我的$in、、'file_ID.txt'或死“$!opening output”;
我的$counter=141;
而(){
s/docID=“/q{docID=“}.$counter++/eg;
打印$out$;
}
使用
s///e
在找到实例时替换并递增计数器,并逐行处理文件,而不是将其全部读入内存并再次将其全部写出来,因为没有真正的理由这样做