如果使用正则表达式匹配字符串。我可以替换另一条线吗?

时间:2016-08-17 18:01:53

标签: perl

如果我使用正则表达式匹配字符串,我可以更改不同行中的字符串吗?基本上,如果存在foo,我想将bar更改为soapbar出现在文本文件的其他行中。 foo,如果存在,将始终显示在bar之前。

while (<FILE>) {
   if (m/foo/){
       s/bar/soap/;
   }
}

数据文件:

foo
food
red
bar
blue

1 个答案:

答案 0 :(得分:5)

当您的if语句匹配时,$_的值尚未更改。 m//已匹配的行与您尝试s///搜索和替换的行相同。相反,你需要设置一个标志,一旦新线被击中,你可以稍后检查:

open my $fh, '<', $filename or die "Cannot open $filename: $!\n";
my $flag = 0;
while (my $line = <$fh>) {
   $flag = 1 if $line =~ /foo/;
   $line =~ s/bar/soap/ if $flag;
}