2010-10-02 16 views

risposta

28

Utilizzare invece $data =~ s/ +/ /;.

Spiegazione:

Il tr è l'operatore translation. Una cosa importante da notare su questo è che i modificatori di espressioni regolari non si applicano in un'istruzione di traduzione (eccetto lo - che indica ancora un intervallo). Così, quando si utilizza
tr/ +/ / che stai dicendo "Prendete ogni istanza dello spazio caratteri e + e di tradurle in uno spazio". In altre parole, la tr pensa dello spazio e + come singoli caratteri, non un'espressione regolare.

Dimostrazione:

$data = "What is the STA++TUS of your mind right now?"; 

$data =~ tr/ +/ /; 

print $data; #Prints "What is the STA TUS of your mind right now?" 

Utilizzando s fa quello che stai cercando, dicendo: "corrisponde a qualsiasi numero di spazi consecutivi (almeno in un caso) e sostituirli con un singolo spazio". Si consiglia inoltre di usare qualcosa come
s/ +/ /g; se c'è più di un luogo che si desidera la sostituzione si verifichi (g significato per applicare a livello globale).

+1

molto bella spiegazione e al punto. – TCM

11

È inoltre possibile utilizzare tr con l'opzione "zucca", che sarà rimuovere duplicati caratteri sostituito. Vedi perlop per i dettagli.

my $s = "foo  bar fubb"; 
$s =~ tr/ //s; 
6

Perl 5.10 ha una nuova classe di caratteri, \h, gli stand per gli spazi orizzontali che è bello per questo genere di cose:

$s =~ s/\h+/ /g; 
Problemi correlati