忽视查找特殊字符和替换的perl

问题描述:

的命令我使用这个命令执行的查找和替换忽视查找特殊字符和替换的perl

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$等我能做些什么,忽略所有特殊字符,只是把表达为正常的字符串

+2

使用'system'命令Perl中调用Perl是相当低效和缓慢的。特别是如果这个操作多次运行,看起来它是(循环遍历'@ arr3'和'@ arr2')。通常情况下打开文件的速度通常要快10倍。 – TLP 2014-10-07 13:49:41

通常要

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

或T他相当于

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', 
    ) 
); 
+0

' - '是绝对必要的,不应该是'-i => -p =>'? – 2014-10-07 14:53:56

+0

是的,否则如果'$ arr3 [$ i]'以'-'开头(OP明确表示可能)会失败//为什么? '-p'不是'-i'的值。 – ikegami 2014-10-07 15:24:36

+0

它们应该被引用,因为它们是system()字符串参数。 – 2014-10-07 15:46:52