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.
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.
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
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
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;