0

我有一个文件处理程序,我正在寻找行中的匹配项并用新行替换匹配项。替换行发生在子例程中。

sub replace{
   seek(FILE,0,0);
   while(my $line= <FILE>){
       if($line =~ m/SOMEMATCH/){
            $line=~ s/SOMEMATCH/REPLACEMENT/;
            print FILE $line;
       }
    } 
}

当我在调用 &replace 后打印文件时,我发现错误的行被改变了,所以:

Line 1
Line 2
Line 3
SOMEMATCH
Line 4
Line 5

变成:

Line 1
Line 2
Line 3
SOMEMATCH
REPLACEMENT
Line 5

这是怎么回事?我如何解决它?

4

1 回答 1

2

我不认为您可以读取文本文件并用更长或更短的字符串替换其中的部分内容并获得您想要的结果。较长的新字符串必须覆盖某些数据,否则如果字符串较短,则会留下“洞”。如果字符串恰好是相同的长度,您的逻辑仍然有问题 - 替换字符串需要您备份,因为您在阅读后超过了要替换的字符串。在该点写入替换应该覆盖下一行,因为这是文件“指针”当前设置为准备读取下一行的位置。

我认为这样的事情最好通过单独的输出文件来完成。读取一个,写入另一个,如有必要,删除第一个并重命名第二个。

或者您可以将整个文件读入一个数组,进行字符串替换,关闭并重新打开文件以进行覆盖,然后将数组写回文件,然后关闭文件。

于 2012-09-03T04:41:21.263 回答