我很抱歉,如果这个问题听起来很愚蠢,但我已经搜索了很多,而且到目前为止,我正在为一天的大部分工作做一个相当简单的工作。
我需要将逐步编号的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
尤利乌斯
答案 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++;
}