Perché non il mio Perl mappa restituire nulla?
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 è?
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.