Perl:替换捕获的组
我最近了解了 Perl 捕获组。我想在 C++ 源代码中查找特定的文本行并替换该行中的数值。
我正在寻找的线路如下:
outf << EPS << "t" << TOL << "t" << ort << "t" << bkw << "t" << gflops << "t# 99-99" << endl;
我要替换的数值是99-99. 我想用由两个数字组成的类似结构替换它,例如6-8,6-16等等。
我用来查找此特定行和数字结构的正则表达式是:
$txt =~ /outf.*t# (d+-d+).*<< endl;/;
数字结构用组正确捕获,并将存储在$1. 的$txt是包含整个C ++文件的源代码的字符串变量。
我改变了正则表达式,试图将匹配的组替换为:
$txt =~ s/outf.*t# (d+-d+).*<< endl;/$eb-$mb/;
但它用存储在变量$eb和 中的新数字结构替换了整行$mb。有没有一种优雅的方法来仅替换捕获的组(d+-d+)?
更新:反对,法官大人,我反对关闭我的问题。首先,它有一个更清晰的问题和一个最小的工作示例。其次,类似问题提供的答案既不雅观又繁琐。第三,Perl 因能够以多种不同方式解决同一问题而臭名昭著。我相信这里提供的答案更合适和清晰。
回答
如果您的 Perl 足够新(5.10+),您可以使用环视。
s/outf.*t# Kd+-d+(?=.*<< endl;)/$eb-$mb/;
# ~~ ~~
K意思是“匹配到这里但忘记你匹配了什么”,所以字符串的开头被匹配,但不会被替换。(?=...)意思是“紧随其后……”,其中零件再次匹配但未被替换。有关详细信息,请参阅perlre。
请注意,您现在根本不需要任何捕获。