特殊文字を処理できません。
次の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]
スクリプトは失敗します。@core[0]
TEST[1]
代わりに代替演算子を使用すると役に立ち?
ません。/
どうすれば正しくできますか?
ベストアンサー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]
nonで指定する必要があります@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++;
}