Perl
從 shell 執行“perl 命令”並使用系統命令從 perl 腳本執行相同的命令
我無法照顧特殊字元。
我有以下 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++; }