[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