2010-10-02 25 views

Respuesta

28

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).

+1

muy buena explicación y al grano. – TCM

11

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; 
6

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; 
Cuestiones relacionadas