Siechfred: Doppelte Listeneinträge entfernen

Beitrag lesen

Hell-O!

my @in = ('1;foo', '2;bar', '3;baz', '4;foo', '0;baz;2');

my %saw;
my @out = grep(!$saw{$}++, map((split(';', $))[1], @in));


> ok, map ersetzt schleife uns splittet @in in jeweils [1].  
  
Die map-Funktion geht alle Arrayelemente durch und wendet auf sie den Ausdruck an, im vorliegenden Falle split, also in der Tat wie eine Schleife. Die Klammer um split ermöglicht es dir, den gesuchten Teil (das Element mit der Indexnummer 1) direkt auszulesen. Das Ergebnis ist ein namenloses Array der gesuchten Teilelemente, auf welches dann grep angewendet wird.  
  

> das (! ausrufezeichen) versteh ich nicht, heisst das wenn nicht ? grep extrahiert wert und füllt nach %saw den wert als name ?  
  
Die Anweisung liest sich wie folgt:  
  
"Greife dir alle Elemente des namenlosen Arrays, für die `$saw{$_}++`{:.language-Perl} nicht wahr ist"  
  
`!$saw{$_}++`{:.language-Perl} besteht aus zwei Teilen: Dem Hochzählversuch ('++') und dem Vergleichsoperator '!' (der nichts anders bedeutet als "wenn nicht"). Wird versucht, ein nicht existentes Element `$saw{$_}`{:.language-Perl} hochzuzählen, liefert die Operation "falsch", da das Element nicht existiert. Gleichzeitig wird es angelegt (Stichwort Autovivikation). Wird dagegen ein existentes Element hochgezählt, ist das Ergebnis der Operation "wahr".  
  
Jetzt kommt das '!' ins Spiel, das seinerseits die Fälle abfragt, in denen das Hochzählen nicht funktioniert hat, denn nur dann taucht das Element zum ersten Mal auf und muss logischerweise in dein Ergebnisarray aufgenommen werden. Eine doppelte Verneinung sozusagen. Ausführlich könnte man es so veranschaulichen:  
  
~~~perl
$bool = $saw{$_}++;  
if($bool) {  
  print "Schlüssel $_ existiert, sein Wert wurde um 1 erhöht";  
}  
else {  
  print "Schlüssel $_ existierte noch nicht und wurde mit dem Wert 1 angelegt";  
}

ich hab da irgendwo eine verständnislücke :(

Ich hoffe, ich konnte sie schließen :)

Siechfred

--
Ich bin strenggenommen auch nur interessierter Laie. (molily)
Zitat des Tages || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.