Perl

從 shell 執行“perl 命令”並使用系統命令從 perl 腳本執行相同的命令

  • October 21, 2015

我無法照顧特殊字元。

我有以下 perl 腳本。

while(@mapping_array[$i])
{  
 chomp(@mapping_array[$i]);
 my @core= split ( /  / , $mapping_array[$i]) ;
 @core[0] =~ tr/ //ds ;   ## Deleting blank spaces
 @core[1] =~ tr/ //ds ;     
 system("perl -pi -e 's/@core[0]/@core[1]/' $testproc ");  
 print "@core[0] \n";
 print "@core[1] \n";
 $i++;
}

問題是我的@core[0]變數可能是一個簡單的字元串,abc比如TEST[1]. 我的腳本按預期工作abc,將其替換為 的值@core[1],但如果 my@core[0]是,它將失敗TEST[1]

在替換運算符中使用?而不是/沒有幫助。我怎樣才能正確地做到這一點?

聽起來你正在尋找quotemeta. 如中所述perldoc -f quotemeta

quotemeta EXPR
       Returns the value of EXPR with all the ASCII non-"word" characters
       backslashed. (That is, all ASCII characters not matching
       "/[A-Za-z_0-9]/" will be preceded by a backslash in the returned
       string, regardless of any locale settings.) This is the internal
       function implementing the "\Q" escape in double-quoted strings.

因此,您的腳本將是(請注意,數組元素應指定為$foo[N],而不是@foo[N]):

chomp(@mapping_array);
while($mapping_array[$i])
{  
   my @core= split ( /  / , $mapping_array[$i]) ;
   $core[0] =~ tr/ //ds ;   ## // Deleting blank spaces
   $core[1] =~ tr/ //ds ;   # / fix SO highlighting
   my($k,$l)=(quotemeta($core[0]),quotemeta($core[1]))
   system("perl -pi -e 's/$k/$l/' $testproc "); 
   print "$core[0] \n$core[1] \n";
   $i++;
}

引用自:https://unix.stackexchange.com/questions/237605