首页 > 解决方案 > 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";

标签: regexperl

解决方案


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 代码执行是一件好事。:)

您可以使用gsub_copyfrom String::Substitution来解决您的问题。

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);

推荐阅读