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)
何时会产生语法错误或令人惊讶的结果?
据我所知,只要你不在替换上添加/ 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)
这可能不是你想要的: