替换文件中的行将替换其下的行。Perl

替换文件中的行将替换其下的行。Perl,perl,file-io,Perl,File Io,我有一个文件处理程序来处理一个文件,我正在查找行中的匹配项,并用新行替换匹配项。替换行发生在子例程中 sub replace{ seek(FILE,0,0); while(my $line= <FILE>){ if($line =~ m/SOMEMATCH/){ $line=~ s/SOMEMATCH/REPLACEMENT/; print FILE $line; } } } 变成:

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

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

Line 1
Line 2
Line 3
SOMEMATCH
REPLACEMENT
Line 5

发生什么事了?如何修复它?

我认为您无法在文本文件中读取内容,并用更长或更短的字符串替换部分内容,从而获得您想要的结果。必须用较长的新字符串覆盖某些数据,否则如果字符串较短,将留下一个“洞”。如果字符串恰好长度相同,那么您的逻辑仍然存在问题-替换字符串将需要您进行备份,因为您已经阅读完要替换的字符串。在该点写入替换应该覆盖下一行,因为文件“指针”当前设置为准备读取下一行

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


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

您是否忘记了尾随字符/或者这只是一个输入错误?@squiguy修复了这一问题,是的,这是一个打字错误::文件也是一个很好的内联编辑模块文件您是对的,覆盖和“漏洞”确实会发生。除了一个单独的输出文件之外,还有其他方法吗?您可以将整个文件读入内存中的数组,替换字符串,然后从头开始将其写回同一个文件。啊,当然!将其读入数组是完美的。非常感谢。
Line 1
Line 2
Line 3
SOMEMATCH
REPLACEMENT
Line 5