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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top