Perl元编程:何时在s ///的REPLACEMENT值上使用quotemeta是不安全的?

Gre*_*con 3 regex perl metaprogramming

Perl的quotemeta运算符通常在SEARCH端工作s///,但是在生成要编译的代码时eval,我应该如何保护应该按字面意思使用的REPLACEMENT,但可能包含诸如$1

使用表单的代码

my $replace = quotemeta $literal_replacement;

my $code = eval <<EOCode;
  sub { s/.../$replace/ }
EOCode
Run Code Online (Sandbox Code Playgroud)

何时会产生语法错误或令人惊讶的结果?

Sec*_*Sec 7

据我所知,只要你不在替换上添加/ e标志,perl就不会用$ replace做神奇的事情.因此,quotemeta将始终更改您的结果,因为它包含大量反斜杠.

#!/usr/bin/perl

$test="test";

$literal_replacement='Hello $1, or \1';
my $replace = quotemeta $literal_replacement;
$test =~ s/test/$replace/;

print $test,"\n";
Run Code Online (Sandbox Code Playgroud)

收益:

Hello\ \$1\,\ or\ \\1
Run Code Online (Sandbox Code Playgroud)

这可能不是你想要的: