Regex 如何找出在Perl替换中被替换的内容?
在应用Regex 如何找出在Perl替换中被替换的内容?,regex,perl,Regex,Perl,在应用s//运算符后,是否有办法找出替换的内容(“旧”文本)?我试着做: if (s/(\w+)/new/) { my $oldTxt = $1; # ... } 但这不起作用$1未定义。您应该能够使用Perl匹配变量: $&包含上次模式匹配匹配的字符串 您可以将替换设置为表达式: if (s/(\w+)/$var=$1; "new"/e) { .. do something with $var .. } 你的代码对我有用。从实际终端窗口复制和粘贴: $ perl -le '
s//
运算符后,是否有办法找出替换的内容(“旧”文本)?我试着做:
if (s/(\w+)/new/) {
my $oldTxt = $1;
# ...
}
但这不起作用<代码>$1未定义。您应该能够使用Perl匹配变量:
$&
包含上次模式匹配匹配的字符串
您可以将替换设置为表达式:
if (s/(\w+)/$var=$1; "new"/e) { .. do something with $var .. }
你的代码对我有用。从实际终端窗口复制和粘贴:
$ perl -le '$_ = "*X*"; if (s/(\w+)/new/) { print $1 }'
X
您的问题一定是其他问题。
$&
做了您想做的事,但看到了中的健康警告
在程序中的任何位置使用此变量都会对所有正则表达式匹配造成相当大的性能损失
如果您可以找到一种不使用$&
的方法来执行此操作,请尝试。您可以运行regex两次:
my ($match) = /(\w+)/;
if (s/(\w+)/new/) {
my $oldTxt = $match;
# ...
}
如果您使用的是5.10或更高版本,则不必使用潜在的performance killing
$&
。来自/p
标志的${^MATCH}
变量执行相同的操作,但仅适用于指定的正则表达式:
use 5.010;
if( s/abc(\w+)123/new/p ) {
say "I replaced ${^MATCH}"
}
和往常一样,向我们展示一个完整的、最小的程序,其中包含证明问题的令人不快的输入。错误可能在其他地方。它一定在其他地方,因为他发布的代码工作得很好。可能他的表达式不匹配,则不会发生替换,并且$1未设置。如果不匹配,则它甚至不会进入“if”@JoelFan的主体:我猜是您简化了代码以便将其发布到此处,这样做就消除了任何bug。虽然这样做可以工作,但没有必要这样做。他发布的代码是正确的。