2012-03-23 12 views
17

Ho stringhe generate dinamicamente come @#@[email protected]!#! e voglio rimuovere caratteri specifici dalla stringa usando Perl.Un modo migliore per rimuovere caratteri specifici da una stringa Perl

Attualmente sto facendo qualcosa di questo (che sostituisce i personaggi con niente):

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

C'è un modo migliore di fare questo? Sto cercando qualcosa di pulito.

risposta

23

hai frainteso come character classes sono utilizzati:

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

fa lo stesso del vostro regex (supponendo che non significa rimuovere ' personaggi dalle vostre corde).

Modifica: lo + consente a più di quei "caratteri speciali" di corrispondere contemporaneamente, quindi dovrebbe anche essere più veloce.

13

È possibile utilizzare il TR invece:

 $p =~ tr/fo//d; 

cancellerà ogni f ed ogni o da $p. Nel tuo caso dovrebbe essere:

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

Beh, se si sta utilizzando la stringa generata a caso in modo che abbia una bassa probabilità di essere accompagnato da qualche stringa intenzionale che si potrebbe normalmente si trova nei dati, allora si probabilmente vuole una stringa per file.

Si prende quella stringa, chiamarla $place_older dire. E poi, quando si vuole eliminare il testo, si chiama quotemeta, e si utilizza il valore di sostituire:

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

Ciò backslash tutti i caratteri non di parola. Questo non funzionerà quando voglio rimuovere solo un set specifico di caratteri. – Ron

6

Con una classe di caratteri così grande è più facile dire ciò che si desidera conservare. Un cursore nella prima posizione di una classe di caratteri inverte il suo senso, in modo da poter scrivere

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

o, utilizzando il più efficiente tr

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