我想从外部数据灵活地读取替代表达式, 所以我的问题可以简化为以下内容:
my $pattern = "s/a/b/g";
my $string = "abcd";
$string =~ $pattern;
print("$string\n");
这不起作用,但是我的问题在哪里? 还是没有解决办法?
答案 0 :(得分:2)
$pattern
不包含正则表达式模式;它包含一些Perl源代码。要评估Perl代码,您需要eval EXPR
(或do
或require
)。
但是,从用户那里获取Perl代码不是一个好主意。相反,我建议分别要求图案和替换,如下所示:
my $pattern = 'a';
my $replacement = 'b';
my $string = 'abcd';
$string =~ s/$pattern/$replacement/g;
如果要允许$1
,并在替换表达式中允许使用String::Substitution,请使用https://laravel.com/docs/6.x/collections#available-methods中的函数。
use String::Substitution qw( gsub_modify );
my $pattern = '(a)(b)';
my $replacement = '$2$1';
my $string = 'abcd';
gsub_modify($string, $pattern, $replacement);