Domanda

Quando sono in esecuzione la seguente dichiarazione:

@filtered = map {s/ //g} @outdata;

esso restituisce una lista vuota invece di elenco filtrato che mi aspettavo.Quello che sto cercando di fare è rimuovere ogni occorrenza di   da un array di stringhe (che è un file XML).

Ovviamente, non sto a capire qualcosa.Qualcuno può dirmi il modo corretto di fare questo potrebbe essere, e perché questo non è lavoro per me, come è?

È stato utile?

Soluzione

Prova questo:

@filtered = map {s/ //g; $_} @outdata;

Il problema è l'operatore in perl modifica $_, ma in realtà restituisce il numero di modifiche apportate.Così, l'extra di $_ alla fine provoca perl per restituire la stringa modificata, per ogni elemento di @outdata.

Altri suggerimenti

Si noti che la mappa è di andare a modificare il sorgente matrice.Così si potrebbe fare:

map {s/ //g} @outdata;

e salta l' @variabile filtrata del tutto, o se avete bisogno di conservare gli originali,

@filtered = @outdata;
map {s/ //g} @filtered;

Anche se, in questo caso, potrebbe essere più leggibile usare foreach:

s/ //g foreach @filtered;

Greg ha risposto il problema che modificherà la matrice originale come $_ sono passati alias.Hai bisogno di:

@filtered = map { (my $new = $_) =~ s/ //g; $new} @outdata;

A seguire Tithonium punto, questo sarà anche fare il trucco:

@filtered = map {local $_=$_; s/ //g; $_} @outdata;

Il "locale", assicura che si sta lavorando su una copia, non l'originale.

In perl 5.14 si potrebbe utilizzare il /r regex modificatore rendere non-distruttivo di sostituzione.

@filtered = map {s/ //gr} @outdata;
use Algorithm::Loops "Filter";
@filtered = Filter { s/ //g } @outdata;

Come contrappunto a Greg risposta, si potrebbero utilizzare in modo improprio grep:

@filtered = grep {s/ //g; 1} @outdata;

Non fare questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top