grep AUSDRUCK, LISTE
grep CODEBLOCK, LISTE
grep fuehrt fuer jedes Element der LISTE den AUSDRUCK bzw. den CODEBLOCK aus, grep liefert dann, wenn das Ergebnis 'WAHR' ist, das Element zurueck oder laesst es aus.
my(@persons) = (
{ name => 'Frank',
age => 16 },
{ name => 'Susanne',
age => 21 },
{ name => 'Peter',
age => 32 },
); my(@over_18) = grep { $_->{'age'} >= 18 } @persons;
print "$_->{'name'}\n" for @over_18;
Es gibt mehrere Varianten zu den gewuenschten Ergebnis zu kommen, grep ist nur die eine und das Ergebnis ist auch nicht der bereinigte Hash sondern eine Liste mit den Schluesseln (Keys) die doppelt vorkommende Werte haben bzw. umgekehrt,w ie man's wuenscht.
Diese Variante ist dann gut wenn man die Eintraege mit den nur einmal vorkommenden Werten fuer die spaetere Weiterverarbeitung noch benoetigt, man sie also aus den Hash nicht loeschen kann.
Die andere Variante verwendet delete() um die nicht mehr benoetigten Elemente aus dem Hash zu loeschen, auch hier gibt es wieder weitere Moeglichkeiten
Variante I:
delete($hash{$_}) for grep { @{$hash{$_}} < 2 } keys %hash;
Variante II:
(scalar @{$hash{$_}} < 2) and delete($hash{$_})
for keys %hash;
Variante III:
for(keys %hash) {
scalar(@{$hash{$_}}) > 1 and next; delete($hash{$_});
}
Abgesehen von der reinen grep Variante (bei der du nur eine Liste der Schluessel erhaelst) unterscheiden sich die anderen von der Performance her kaum, dass heiszt man kann sich fuer die entscheiden die man fuer sich 'am besten lesbar' haelt.
Datum: 11.06.2007-13:13
