regex - $& 未作为 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);
解决方案
工作解决方案和非工作解决方案之间的区别与两者的区别相同
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]`.
推荐阅读
- xcuitest - XCUITest - 如何访问 XCUITest 中的应用设备令牌以触发推送通知,但无需在应用代码中设置任何 UIView?
- ruby-on-rails - has_many :通过一次调用在连接表中添加额外的参数(对象创建)
- python - Matplotlib:脚本等待“输入()”时无法操作绘图
- excel - 进行组合并检查每个可行的组合
- session - Redis Sentinel,Standalone 还是 Cluster,哪个最适合 session?
- sql-server - 连接到不同的服务器并使用批量插入
- javascript - JavaScript/NodeJS:检查 instanceof 的父方法
- c# - 来自字节数组 Cocoa 应用 Xamarin C# 的 NSImage 源
- android-studio - 编译错误:“-Xcoroutines 无效:在 1.3 及更高版本中无论如何都启用了协程”
- cqrs - CQRS/ES 系统中的 POST/PUT 响应 REST