Por qué no mi Perl mapa devolver nada?
Pregunta
Cuando estoy ejecutando la siguiente instrucción:
@filtered = map {s/ //g} @outdata;
devuelve una lista vacía en lugar de la lista filtrada que yo esperaba.Lo que estoy tratando de hacer es eliminar todas las ocurrencias de
a partir de una matriz de cadena (que es un archivo XML).
Obviamente, no estoy entendiendo algo.¿Alguien puede decirme la forma correcta de hacer esto podría ser, y por qué esto no está funcionando para mí como es?
Solución
Intente esto:
@filtered = map {s/ //g; $_} @outdata;
El problema es el s operador en perl modifica $_ pero en realidad devuelve el número de cambios realizados.Así, el extra de $_ al final de las causas de perl para devolver la cadena modificada para cada elemento de @outdata.
Otros consejos
Tenga en cuenta que el mapa va a modificar su matriz de origen así.Así que usted podría hacer:
map {s/ //g} @outdata;
y olvidese de la @filtrada variable por completo, o si usted necesita conservar los originales,
@filtered = @outdata;
map {s/ //g} @filtered;
Aunque, en ese caso, podría ser más legible para el uso de foreach:
s/ //g foreach @filtered;
Greg respuesta tiene el problema que se va a modificar la matriz original como el de $_ se pasan un alias.Usted necesita:
@filtered = map { (my $new = $_) =~ s/ //g; $new} @outdata;
Para el seguimiento de Tithonium punto, esto también va a hacer el truco:
@filtered = map {local $_=$_; s/ //g; $_} @outdata;
El "local" se asegura de que usted está trabajando en una copia, no el original.
En perl 5.14 se podría utilizar el /r regex modificador de que los no-destructiva de sustitución.
@filtered = map {s/ //gr} @outdata;
use Algorithm::Loops "Filter";
@filtered = Filter { s/ //g } @outdata;
Como contrapunto a Greg respuesta, usted podría mal uso de grep:
@filtered = grep {s/ //g; 1} @outdata;
No hacer esto.