Calocybe: Doppelte Werte aus Listen löschen ...

Beitrag lesen

hi!

@out = grep(!$saw{$_}++, @in);

Kannst du denn genau erklären, wie diese Methode funktioniert, oder hast du es einfach nur abgeschrieben? ;))

Wieso sollte er's nicht erklaeren koennen? Steht doch im Klartext in der perlfunc man page. Und auf den Kopf gefallen ist Cheatah ja nun auch nicht.

<CITE>
grep EXPR,LIST
grep BLOCK LIST

[...]
Evaluates the BLOCK or EXPR for each element of LIST (locally setting $_ to each element) and returns the list value consisting of those elements for
which the expression evaluated to TRUE.
</CITE>

Naja, das kennste ja sicher selber. Fuer jedes Listenelement wird ein Element im Hash saw mit dem Wert 1 angelegt (denn undef()+1 ist 1). Das Konstrukt gibt aber trotzdem undefined zurueck, da die Inkrementierung erst nach dem Bilden des Return-Wertes durchgefuehrt wird (weil ++ hinten steht und nicht vorn). Also gibt die Hash-Abfrage (ohne !) undefined zurueck, wenn ein Element noch nicht gesichtet wurde, wodurch wegen ! eine 1 entsteht und grep() dieses Listenelement outputtet. Beim naechsten Auftreten desselben Listen-Elements wird das zugehoerige Hash-Element auf 2 erhoeht, nicht jedoch bevor die bereits drinstehende 1 mit ! in false umgewandelt wird und das Listenelement demnach von grep() nicht mehr ausgeworfen wird. Eigentlich ziemlich genial, dieses kleine Stueckchen Code. Aber das ist eben Perl! Da kannste Sachen in einer Zeile machen, fuer die Du woanders ne ganze Seite schreiben musst.

Calocybe