regex - 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 代码执行是一件好事。:)
您可以使用gsub_copy
from 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);
推荐阅读
- javascript - 如何从 iframe 的控制台捕获日志?
- java - 输出中的 Visual Studio 目录
- linux - 在 cpanel (crontab) 上更改 cron 作业的时区
- angular - 订阅 Angular 9 组件上可观察到的变化的适当位置
- sql - Athena UNION - 我需要定义结构列吗?
- javascript - 使用 JavaScript 获取 url 参数的站点加载时间
- debian - 如何在 Debian 上修复 apt-get 的“无法找到软件包”?
- nestjs - Nestjs applyDecorators 用于多个装饰器
- android - ndk.abiFilters 在幕后做什么?
- python - 在导入的模块中打开文件