webentwicklung-frage-antwort-db.com.de

Besser können Sie bestimmte Zeichen aus einer Perl-Zeichenfolge entfernen

Ich habe dynamisch generierte Zeichenfolgen wie @#@[email protected]!#! generiert und möchte bestimmte Zeichen mithilfe von Perl aus der Zeichenfolge entfernen.

Momentan mache ich etwas (Ersetzen der Zeichen durch nichts):

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

Gibt es einen besseren Weg, dies zu tun? Ich mache etwas sauberes.

18
Ron

Sie haben missverstanden, wie Zeichenklassen verwendet werden:

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

tut das gleiche wie Ihr Regex (vorausgesetzt, Sie wollten nicht '-Zeichen aus Ihren Zeichenfolgen entfernen). 

Edit: Der + erlaubt es, mehrere dieser "Sonderzeichen" auf einmal zuzuordnen, daher sollte es auch schneller sein.

24
Tim Pietzcker

Sie können stattdessen die tr verwenden: 

       $p =~ tr/fo//d;

löscht jedes f und jedes o aus $p. In Ihrem Fall sollte es sein:

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

Mit einer so großen Charakterklasse ist es einfacher zu sagen, was Sie behalten möchten. Ein Caret an der ersten Position einer Zeichenklasse kehrt den Sinn um, sodass Sie schreiben können

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

oder mit der effizienteren tr

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

Wenn Sie die zufällig generierte Zeichenfolge verwenden, sodass die Wahrscheinlichkeit gering ist, dass sie mit einer beabsichtigten Zeichenfolge übereinstimmt, die Sie normalerweise in den Daten finden, möchten Sie wahrscheinlich eine Zeichenfolge pro Datei. 

Du nimmst diese Zeichenfolge und nennst sie $place_older sagen. Und dann, wenn Sie den Text entfernen möchten, rufen Sie quotemeta auf und verwenden diesen Wert, um Folgendes zu ersetzen: 

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