2012-03-23 41 views
17

He generado dinámicamente cadenas como @#@[email protected]!#!, y quiero eliminar los caracteres específicos de la cadena usando Perl.mejor manera para eliminar caracteres específicos de una cadena Perl

Actualmente estoy haciendo algo tan (en sustitución de los personajes sin nada):

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

¿Hay una mejor manera de hacer esto? Estoy fooking algo limpio.

Respuesta

23

que has entendido mal cómo se utilizan character classes:

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

hace lo mismo que su expresión regular (suponiendo que no quería decir para eliminar ' personajes de sus cadenas).

Editar: El + permite que varios de esos "caracteres especiales" para que coincida a la vez, por lo que también debe ser más rápido.

13

Se podría utilizar el tr lugar:

 $p =~ tr/fo//d; 

borrará todos y cada f o desde $p. En su caso, debería ser:

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

Bueno, si usted está utilizando la cadena generada de forma aleatoria para que tenga una baja probabilidad de ser igualada por alguna cadena intencional que normalmente se puede encontrar en los datos, entonces probablemente querrá una cuerda por archivo.

Se toma esa cadena, lo llama $place_older decir. Y a continuación, cuando se quiere eliminar el texto, se llama a quotemeta, y utiliza ese valor para sustituir:

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

Esto hará barra invertida todos los caracteres que no son de texto. Esto no funcionará cuando quiero quitar sólo un conjunto específico de caracteres. – Ron

6

Con una clase de caracteres así de grande es más fácil decir lo que desea conservar. Un símbolo de intercalación en la primera posición de una clase de caracteres invierte su sentido, para que pueda escribir

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

o, utilizando la más eficiente tr

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