web-dev-qa-db-ja.com

Perl文字列から特定の文字を削除するより良い方法

@#@!efq@!#!のような動的に生成された文字列があり、Perlを使用して文字列から特定の文字を削除したいです。

現在、私はこれを何かしています(文字を何も置き換えません):

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

これを行うより良い方法はありますか?きれいなものを探しています。

18
Ron

文字クラス の使用方法を誤解しました:

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

正規表現と同じことを行います(文字列から'文字を削除するつもりはなかったと仮定)。

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

24
Tim Pietzcker

代わりにtrを使用できます。

       $p =~ tr/fo//d;

$pからすべてのfとすべてのoを削除します。あなたの場合、次のようになります。

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

キャラクタークラスがこれほど大きいと、保持したい内容を簡単に言うことができます。文字クラスの最初の位置にあるキャレットはその意味を反転させるため、次のように書くことができます。

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

または、より効率的なtrを使用して

$varTemp =~ tr/"%'+\-0-9<=>A-Z_a-z{|}//cd
7
Borodin

ランダムに生成された文字列を使用して、通常データにある意図的な文字列と一致する可能性が低い場合は、おそらくファイルごとに1つの文字列が必要です。

あなたはその文字列を取り、それを$place_older いう。そして、テキストを削除したい場合は、 quotemeta を呼び出し、その値を使用して置換します。

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