Perl替换操作符替换端使用表达式失效原因及正确用法问询
Perl正则替换中代码不执行的原因分析
你的问题核心在于Perl正则替换的替换端语法规则:默认情况下,s///的替换部分会被当作普通字符串处理,不会执行其中的代码逻辑。
你最初写的代码:
$l_filedata =~ s/OVERRIDE_CONTAINS_FUNCTIONS/eval(Dumper($hash_ref->{'ContainsMessage'}))/g;
这里的eval(Dumper(...))只是被当作纯文本直接插入到替换位置,Perl根本没有去执行这段代码,所以才会出现abceval(Dumper(HASH(0xe88f00)))asdfghjk这样的结果——它只是把你写的代码原样输出了。
而用变量先存储Dumper结果再替换能成功,是因为$temp已经是计算好的字符串,替换时直接引用变量的实际值即可。
要让替换端的代码被执行,你需要给正则替换加上**/e修饰符**(execute的缩写),它会告诉Perl:把替换部分当作Perl代码运行,然后用运行后的结果作为替换内容。
修正后的代码可以写成:
$l_filedata =~ s/OVERRIDE_CONTAINS_FUNCTIONS/Dumper($hash_ref->{'ContainsMessage'})/eg;
这里不需要额外加eval,因为/e已经会触发Dumper函数的执行了,eval是多余的。
额外补充:
/e可以和其他修饰符叠加,比如/eg表示全局替换且替换端执行代码- 如果替换逻辑复杂(比如需要多步处理字符串),也可以把代码放在大括号里,比如:
$l_filedata =~ s/OVERRIDE_CONTAINS_FUNCTIONS/ { my $str = Dumper($hash_ref->{'ContainsMessage'}); $str =~ s/\n/ /g; # 把换行换成空格 $str } /eg;
内容的提问来源于stack exchange,提问作者BMD
相关产品推荐
相关产品推荐

