Perché non funziona?Come posso sostituire più spazi bianchi con un singolo spazio in Perl?
$data = "What is the STATUS of your mind right now?";
$data =~ tr/ +/ /;
print $data;
Perché non funziona?Come posso sostituire più spazi bianchi con un singolo spazio in Perl?
$data = "What is the STATUS of your mind right now?";
$data =~ tr/ +/ /;
print $data;
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).
È 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;
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;
molto bella spiegazione e al punto. – TCM