如何解决Perl:在替换字符串变量中使用反向引用
我正在Perl中执行字符串替换,但是我将模式和替换字符串都存储为正则表达式运算符之外的标量变量。问题是我希望替换字符串能够使用反向引用。
我希望下面的代码能更清楚地说明问题。
my $pattern = 'I have a pet (\w+).';
my $replacement = 'My pet $1 is a good boy.';
my $original_string = 'I have a pet dog.';
# Not Working
my $new_string = $original_string =~ s/$pattern/$replacement/r;
# Working
#my $new_string = $original_string =~ s/$pattern/My pet $1 is a good boy./r;
# Expected: "My pet dog is a good boy."
# Actual: "My pet $1 is a good boy."
print "$new_string\n";
解决方法
s/$pattern/My pet $1 is a good boy./
是
的缩写s/$pattern/ "My pet $1 is a good boy." /e
替换表达式("My pet $1 is a good boy."
)是插入$1
的字符串文字。
这意味着
s/$pattern/$replacement/
是
的缩写s/$pattern/ "$replacement" /e
替换表达式("$replacement"
)是插入$replacement
(而不是$1
)的字符串文字。
虽然可能会妨碍您,但perl
并不习惯于将变量的内容作为Perl代码执行,这是一件好事。 :)
您可以使用String::Substitution中的gsub_copy
来解决问题。
use String::Subtitution qw( gsub_copy );
my $pattern = 'I have a pet (\w+)\.';
my $replacement = 'My pet $1 is a good boy.';
my $original_string = 'I have a pet dog.';
my $new_string = gsub_copy($original_string,$pattern,$replacement);
,
替换字符串中的$1
只是连续的字符$
和1
,并使其成为变量以便进行第一次捕获必须克服困难。†
如何选择
my string = q(a pet dog);
my $pattern = qr/a pet (\w+)/;
my $new = $string =~ s/$pattern/ repl($1) /er;
sub repl {
my ($capture) = @_;
return "$capture is a good boy";
}
子实际上是在哪里
sub repl { "$_[0] is a good boy" }
功能更多,但功能更强大,更灵活。
†或者,按照每个池上的答案,可以使用String::Substitution将所有涉及的“ niceties”包装成一个电话
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。