在应用s///
运算符后,有没有办法找出替换的内容(“旧”文本)?我试过了:
if (s/(\w+)/new/) {
my $oldTxt = $1;
# ...
}
但这不起作用。 $1
未定义。
答案 0 :(得分:7)
您的代码适合我。从真实的终端窗口复制并粘贴:
$ perl -le '$_ = "*X*"; if (s/(\w+)/new/) { print $1 }'
X
你的问题必须是别的。
答案 1 :(得分:6)
如果您使用的是5.10或更高版本,则不必使用潜在性能消除$&
。 ${^MATCH}
标志中的/p
变量执行相同的操作,但仅适用于指定的正则表达式:
use 5.010;
if( s/abc(\w+)123/new/p ) {
say "I replaced ${^MATCH}"
}
答案 2 :(得分:1)
$&
执行您想要的操作,但请参阅perlvar
在程序中的任何位置使用此变量会对所有正则表达式匹配造成相当大的性能损失。
如果您可以在不使用$&
的情况下找到解决方法,请尝试使用此方法。你可以运行两次正则表达式:
my ($match) = /(\w+)/;
if (s/(\w+)/new/) {
my $oldTxt = $match;
# ...
}
答案 3 :(得分:0)
您可以将替换设为eval表达式:
if (s/(\w+)/$var=$1; "new"/e) { .. do something with $var .. }
答案 4 :(得分:-1)
您应该能够使用Perl匹配变量:
$&
包含与上一次模式匹配匹配的字符串