首页 > 解决方案 > $& 未作为 perl 替换的一部分解决

问题描述

我有一个 perl 脚本,可以搜索和替换多个文件中的数据。由于一个文件中可以替换多个单词,因此我编写了一个函数,将搜索和替换模式作为数组接受。然后我循环遍历这个函数中的数组并执行替换。它运行良好,但仅针对一个特定文件,我需要在匹配的字符串(字符#)前面附加一些内容。因此,我通过 "#\$&" 作为我的替换模式。它收到正确但不知何故 $& 从未解决。相反,该操作将匹配的字符串替换为文字值“#$&”。如果我在 readFile 函数的替换命令中直接使用 #$& ,同样的事情也有效。我知道我们也许可以通过其他方式实现结果,但我真的很想知道为什么相同的替换模式在直接传递时有效,而在作为数组元素读取时无效。我已经评论了可以很好地参考的替换命令。谁能帮我在这里发现问题?

my @search= ("host\\s*(replication|all)");
my @replace= ("#\$&");

my $sLine = scalar @search;
my $rLine = scalar @replace;

my $data = ???;

for ( my $i=0; $i < $sLine; $i++)
{
     print("\n search = $search[$i]  replace = $replace[$i] \n");
     #$data =~ s/$search[$i]/#$&/g; ==> this works
     $data =~ s/$search[$i]/$replace[$i]/g; #==> this doesn't
}

print($data);

标签: regexperl

解决方案


工作解决方案和非工作解决方案之间的区别与两者的区别相同

print "#$&";              # Prints `#` and the value of `$&`.

print "$replace[$i]";     # Prints the value of `$replace[$i]`.

您可以使用以下内容:

use String::Substitution qw( gsub_modify );

for my $i (0..$#search) {
   gsub_modify($data, $search[$i], $replace[$i]);
}

这是一个更深入的解释。

s/$search[$i]/#$&/g

简称

s/$search[$i]/  "#$&"   /eg

这相当于

s/$search[$i]/  "#" . $&   /eg    # Replaces with `#` and the value of `$&`.

/e导致替换表达式被评估为 Perl 代码,使用其结果作为替换字符串。

另一方面,

s/$search[$i]/$replace[$i]/g

简称

s/$search[$i]/  "$replace[$i]"   /eg

这相当于

s/$search[$i]/  $replace[$i]   /eg    # Replaces with the value of `$replace[$i]`.

推荐阅读