2010-10-02 5 views

Répondre

28

Utilisez plutôt $data =~ s/ +/ /;.

Explication:

Le tr est l'opérateur translation. Une chose importante à noter à ce sujet est que les modificateurs regex ne s'appliquent pas dans une instruction de traduction (à l'exception de - qui indique toujours une plage). Donc quand vous utilisez
tr/ +/ / vous dites "Prenez chaque instance de l'espace des caractères et + et traduisez-les en espace". En d'autres termes, le tr pense à l'espace et + en tant que caractères individuels, pas une expression régulière.

Démonstration:

$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?" 

En utilisant s fait ce que vous cherchez, en disant « correspond un nombre d'espaces consécutifs (au moins un cas) et les remplacer par un seul espace ». Vous pouvez également utiliser quelque chose comme
s/ +/ /g; s'il y a plus d'un endroit où vous voulez que la substitution se produise (g signifiant s'appliquer globalement).

+1

explication très agréable et au point. – TCM

11

Vous pouvez également utiliser tr avec l'option "squash", qui supprimera les caractères remplacés en double. Voir perlop pour plus de détails.

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

Perl 5.10 a une nouvelle classe de personnage, \h, les stands pour un espace horizontal, ce qui est agréable pour ce genre de chose:

$s =~ s/\h+/ /g; 
Questions connexes