2012-03-23 11 views
17

私は@#@[email protected]!#!のような動的に生成された文字列を持っており、Perlを使って文字列から特定の文字を削除したいと思います。Perl文字列から特定の文字を削除するより良い方法

は現在、私は何か、この(何も文字を置き換える)を行っています:

$varTemp =~ s/['\$','\#','\@','\~','\!','\&','\*','\(','\)','\[','\]','\;','\.','\,','\:','\?','\^',' ', '\`','\\','\/']//g; 

は、これを行うのより良い方法はありますか?私は何かきれいなもののためにfookingです。

答えて

23

あなたはcharacter classesが使用されている方法を誤解しました:

$varTemp =~ s/[\$#@~!&*()\[\];.,:?^ `\\\/]+//g; 

は(あなたの文字列から'文字を削除するという意味ではありませんでしたと仮定して)あなたの正規表現と同じように行います。

編集:+は、これらの「特殊文字」のいくつかを一度に一致させることができるため、高速化する必要があります。

13

あなたは代わりにTRを使用することもできます。

 $p =~ tr/fo//d; 

は、すべてFと$pからすべてのOを削除します。あなたのケースでは、それは次のようになります。

 $p =~ tr/\$#@~!&*()[];.,:?^ `\\\///d 
0

まあ、それはあなたが正常にデータに見つけるかもしれないいくつかの意図的な文字列でマッチしている確率が低いように、あなたはあなたがして、ランダムに生成された文字列を使用している場合おそらくファイルごとに1つの文字列が必要です。

あなたはその文字列を取って、それを$place_olderと呼んでください。そして、あなたがテキストを解消したい場合、あなたはquotemetaを呼び出して、あなたが値を代入することを使用します。

my $subs = quotemeta $place_holder; 
s/$subs//g; 
+0

を使用して書くことができるように、文字クラスの最初の位置にキャレットは、その意味を反転します。これは、特定の文字セットだけを削除したいときには機能しません。 – Ron

6

文字クラスでは、この大きなあなたが残しておきたいものを言うことが容易です。あなたは

$varTemp =~ s/[^"%'+\-0-9<=>a-z_{|}]+//gi 

か、これはすべての非単語文字をバックスラッシュになる、より効率的なtr

$varTemp =~ tr/"%'+\-0-9<=>A-Z_a-z{|}//cd 
関連する問題