De ce harta mea Perl nu returnează nimic?

Când rulez următoarea declarație:

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

it is returning an empty list instead of the filtered list that I expected. What I am trying to do is remove every occurrence of   from an array of string (which is an xml file).

Evident, eu nu înțeleg ceva. Poate cineva să-mi spună calea corectă de a face acest lucru ar putea fi, și de ce acest lucru nu este de lucru pentru mine așa cum este?

0
fr hi bn
Aceasta este legată de stackoverflow.com/questions/1458454/… , și are același răspuns.
adăugat autor brian d foy, sursa

7 răspunsuri

use Algorithm::Loops "Filter";
@filtered = Filter { s/ //g } @outdata;
0
adăugat

Incearca asta:

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

Problema este că operatorul s în perl modifică $ _, dar returnează efectiv numărul de modificări efectuate. Deci, extra $ _ la sfarsit provoaca perl sa returneze stringul modificat pentru fiecare element al @outdata.

0
adăugat
Cu Perl 5.14 substituirii nedistructive , puteți face acest lucru ca și @filtered = map {s/& nbsp;//gr} @outdata fără a afecta @outdata .
adăugat autor brian d foy, sursa
Nu mă simt suficient de mult pentru a scăpa, dar aceasta este o idee rea. stackoverflow.com/questions/12103/& hellip; este un răspuns mult mai bun.
adăugat autor Rob Van Dam, sursa
Acest cod distruge valorile în @outdata.
adăugat autor Kevin Panko, sursa

Pentru a urmări punctul de vedere al lui Tithonium, acest lucru va face și trucul:

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

"Local" vă asigură că lucrați la o copie, nu la original.

0
adăugat

Ca un contrapunct la răspunsul lui Greg, ați putea folosi grep grep:

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

Nu faceți acest lucru.

0
adăugat

Rețineți că harta va modifica, de asemenea, matricea sursă. Deci, puteți face fie:

map {s/ //g} @outdata;

și săriți complet variabila @filtered sau dacă trebuie să păstrați originalele,

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

Deși, în acest caz, ar putea fi mai ușor să se folosească foreach:

s/ //g foreach @filtered;
0
adăugat
map în context void este, în general, considerată formă slabă și nu spune nimic peste pentru @filtered {...} .
adăugat autor brian d foy, sursa

Răspunsul lui Greg are problema că va modifica matricea inițială pe măsură ce $ _ s-ar trece în alianță. Ai nevoie:

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

În perl 5.14 puteți folosi modificatorul de regex /r pentru a a face o înlocuire nedistructivă .

@filtered = map {s/ //gr} @outdata;
0
adăugat