我有一个文件的文件处理程序,我正在寻找行中的匹配项并用新行替换匹配项。替换行在子例程中发生。
sub replace{
seek(FILE,0,0);
while(my $line= <FILE>){
if($line =~ m/SOMEMATCH/){
$line=~ s/SOMEMATCH/REPLACEMENT/;
print FILE $line;
}
}
}
当我在调用&amp; replace后打印文件时,我发现错误的行被更改了:
Line 1
Line 2
Line 3
SOMEMATCH
Line 4
Line 5
变为:
Line 1
Line 2
Line 3
SOMEMATCH
REPLACEMENT
Line 5
发生了什么事?我该如何解决?
答案 0 :(得分:2)
我认为您不能阅读文本文件并将其中的部分内容替换为更长或更短的字符串并获得您想要的结果。必须通过较长的新字符串覆盖某些数据,或者如果字符串较短则留下“洞”。如果字符串恰好是相同的长度,那么你的逻辑仍然存在问题 - 替换字符串将需要你备份,因为你在读完之后已经过了要替换的字符串。在那一点写一个替换应该覆盖下一行,因为那是文件“指针”当前设置为准备读取下一行的地方。
我认为这样的事情最好通过单独的输出文件来完成。读一个,写另一个,如有必要,删除第一个并重命名第二个。
或者您可以将整个文件读入数组,进行字符串替换,关闭并重新打开文件以进行覆盖,然后将数组写回文件,然后关闭文件。