Regex 忽略perl的find和replace命令中的特殊字符

Regex 忽略perl的find和replace命令中的特殊字符,regex,perl,replace,Regex,Perl,Replace,我正在使用此命令执行查找和替换 system( "perl -pi -e 's/$arr3[$i]/$arr2[$i]/g' /opt/app/d1ebl1m5/dv02/cingbt02/J2EEServer/config/AMSS/application/properties/CSCEnvVar.properties_try"); $arr3[$i]的值包含特殊字符,如-e、$等。如何忽略所有特殊字符,将表达式视为您通常需要的普通字符串 my $search_pat = quotemeta

我正在使用此命令执行查找和替换

system( "perl -pi -e 's/$arr3[$i]/$arr2[$i]/g' /opt/app/d1ebl1m5/dv02/cingbt02/J2EEServer/config/AMSS/application/properties/CSCEnvVar.properties_try");
$arr3[$i]
的值包含特殊字符,如
-e
$
等。如何忽略所有特殊字符,将表达式视为您通常需要的普通字符串

my $search_pat = quotemeta($search);    
s/\Q$search_pat\E/$replace/g
或同等品

s/\Q$search\E/$replace/
生成代码通常不是一个好主意,因此解决方案变得非常简单

system(
   perl => (
      '-i', '-p',
      '-e' => '
         BEGIN { $s = shift(@ARGV); $e = shift(@ARGV); }
         s/\Q$s/$e/g
      ',
      '--',
      $arr3[$i],
      $arr2[$i],
      '/opt/app/.../CSCEnvVar.properties_try',
   )
);

使用
system
命令在Perl中调用Perl效率很低,速度也很慢。特别是如果此操作运行多次,就像它看起来那样(在
@arr3
@arr2
上循环)。正常打开文件的速度可能要快10倍。
--
是绝对必要的,而不应该是
-i=>-p=>
?是的,否则如果
$arr3[$i]
-
开头(OP特别指出这是可能的)//为什么
-p
不是
-i
的值。它们应该被引用,因为它们是system()字符串参数。@mpapec,哼,
-i
不需要被引用,但是
-p
需要被引用吗
perl-E'use-strict;表示-i,-p'
。已修复。
-p
是命名管道的测试,而
-e
由于逗号太长而被引用。不知道为什么
-我不需要报价+1,移位时可能隐含@ARGV。