¿Por qué no funciona?¿Cómo puedo reemplazar múltiples espacios en blanco con un solo espacio en Perl?
$data = "What is the STATUS of your mind right now?";
$data =~ tr/ +/ /;
print $data;
¿Por qué no funciona?¿Cómo puedo reemplazar múltiples espacios en blanco con un solo espacio en Perl?
$data = "What is the STATUS of your mind right now?";
$data =~ tr/ +/ /;
print $data;
Use $data =~ s/ +/ /;
en su lugar.
Explicación:
El tr
es el operador translation. Una cosa importante a tener en cuenta acerca de esto es que los modificadores de expresiones regulares no se aplican en una declaración de traducción (excepto -
que todavía indica un rango). Entonces cuando usa
tr/ +/ /
está diciendo "Tome cada instancia del espacio de caracteres y +
y tradúzcalos a un espacio". En otras palabras, el tr
piensa en el espacio y +
como caracteres individuales, no una expresión regular.
Demostración:
$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?"
Usando s
hace lo que usted está buscando, al decir "coincide con cualquier número de espacios consecutivos (por lo menos un ejemplo) y sustituirlos por un solo espacio". Es posible que también desee utilizar algo como
s/ +/ /g;
si hay más de un lugar donde desea que ocurra la sustitución (g
significa aplicar globalmente).
También puede usar tr
con la opción "aplastar", que eliminará los caracteres reemplazados duplicados. Ver perlop para más detalles.
my $s = "foo bar fubb";
$s =~ tr/ //s;
Perl 5.10 tiene una nueva clase de caracteres, \h
, las gradas de un espacio en blanco horizontal que es bueno para este tipo de cosas:
$s =~ s/\h+/ /g;
muy buena explicación y al grano. – TCM