Thread einmalige Eintraege in einer Liste filtern (9 answers)
Opened by Gemuese at 2009-08-19 13:43

Linuxer
 2009-08-21 12:46
#124578 #124578
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
Ich finde es besser, die Zeile im Kontext zu betrachten:
Code (perl): (dl )
1
2
3
4
my %seen;
$seen{$_}++ for @list;

my @single = grep{ $seen{$_} == 1 }keys %seen;


Zunächst wird jedes Element aus @list als Schlüssel im Hash %seen eingetragen und der jeweilige Wert um eins erhöht.
Somit hast Du in %seen nun eine Zuordnung zwischen Elementname und der Anzahl, wie häufig dieser Name in @list vorkommt.

Die letzte Zeile ist von rechts nach links zu lesen:
- es werden erstmal alle Schlüssel des Hashs %seen ausgelesen
- dann werden mit grep jene Elemente erfasst, die im Hash mit einem Wert von genau 1 registriert sind
- die Ergebnisliste des grep wird dann @single zugewiesen

Damit hast Du letzten Endes genau die Elemente aus @list ermittelt, die genau einmal in @list vorkommen.

Wenn Du das "== 1" durch ">= 1" kriegst Du alle Elemente, die mindestens einmal in @list vorkommen (Der Wert von $seen{$_} ist größer oder gleich 1).
Dieser Vergleich ist dann aber überflüssig, wie pq bereits anmerkte.
Damit ein Schlüssel im Hash %seen auftauchen kann, muss er wenigstens einmal in @list vorhanden gewesen sein.
Damit reicht es aus, sich einfach nur die Schlüssel des Hashes ausgeben zu lassen.

HTH,
Linuxer
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread einmalige Eintraege in einer Liste filtern