[nr-pm] Blackbox
DJ Adams
dj.adams at pobox.com
Sam Jan 20 16:05:08 CST 2001
Arne schickte:
> #!/usr/bin/perl
> @mehrfach=('eins','eins','zwei','drei','eins','drei');
> @uniq = grep { ! $seen{$_} ++ } @mehrfach;
> foreach (@uniq)
> {
> print "$_\n";
> }
Also ich gehe davon aus, das es um die Zeil mit 'grep' geht ;-)
dieses Zeil dient dazu das @uniq bekommt die unique (dt. uebersetzung?)
Elemente aus @mehrfach, also in diesem Fall nuer 'eins', 'zwei' und
'drei'.
Es funktioniert so:
Das Block { ! $seen{$_} ++ } wird fuer jedes Element aus @mehrfach
ausgefuehrt (dabei ist $_ mit den Element-Wert gefuellt); da wird an
@uniq nur die Werte wo das Block-Ergebis True ist geliefert.
Und was macht dieses Block? Der benutzt einem Hash %seen zu wissen ob einen
Element-Wert schon mal gesehen war - Die Hash-value mit dem Schluessel
$_ wird incrementieret (++) ; nur in dem Fall das das Wert $_ noch nicht
gesehen war ist die Hash-value fuer $_ noch null. Und die 'not' operator
('!') setzt die Hash-value auf den logischen Kopf, also nur in dem Fall
wo das Wert $_ zum ersten mal gesehen ist - Hash-value ist 0 - wird $_
weiter an @uniq geliefert weil '! 0' ist True.
Noch ein weg um die unique Werte zu finden: ersetze die 'grep' Zeil
mit
@uniq{@mehrfach}++;
Der Unterschied?
Dein 'grep' Loesung behaelt die Reihenfolge von @mehrfach, diese nicht.
So was is besser zu merken wenn z.B. die erste Element in @mehrfach ist
'drei'.
phew
hab' noch nie was so kompliziert auf deutsch erklaert ;-)
dj
___________________________
Abmelden:
Mail an majordomo at hfb.pm.org mit dem Text:
unsubscribe niederrhein-pm