2014-10-07 6 views
0

заменить Я использую эту команду для выполнения поиска и заменыигнорировать специальные символы в находке и команду 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

ответ

2

Вы обычно хотите

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

Действительно ли '--' необходимо и не должно быть' -i => -p => '? –

+0

Да, в противном случае он будет терпеть неудачу, если '$ arr3 [$ i]' начинается с '-' (что конкретно указано в OP) // Почему? '-p' не является значением для' -i'. – ikegami

+0

Их следует указывать тогда, когда они являются системными() строковыми аргументами. –

Смежные вопросы