Thread Hilfe für Regex (21 answers)
Opened by lousek at 2011-08-06 17:24

Dubu
 2011-08-09 00:05
#151358 #151358
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
2011-08-08T18:04:09 lousek
1. ist mir nicht hunderprozentig klar, was Set::Scalar ist, die Doku sagt dazu nur "basic set operations";

Genau das ist es. So eine Art "Mengenlehre", wobei die Mengen aus skalaren Werten bestehen: Vereinigungsmengen (union), Schnittmengen (intersection), Restmengen (difference) und so weiter.

Quote
2. was ist der unterschied zwischen difference und unique resp warum verwendest du nicht unique?
Code: (dl )
1
2
3
    $a->difference($b, $c)              (a b)
$a->symmetric_difference($b, $c) (a b e h i)
$a->unique($b, $c) (a b h i)

Du zeigst hier gerade die komplexeren Beispiele mit drei Mengen. Für deine Anwendung reichen ja zwei Mengen, daher beschränke ich mich darauf.
Ein $a->difference($b) bedeutet soviel wie "alle Elemente von $a außer denen, die auch in $b sind".

Quote
Das unique hier scheint nicht wie das uniq vom linux commando zu sein, wo Zeilen, welche in beiden vorkommen, entfernt werden.

Doch, genau das ist es. Mit zwei Mengen: $a->unique($b) sind alle Elemente, die in $a, aber nicht in $b sind, vereinigt mit allen Elementen, die in $b, aber nicht in $a sind. $a->unique($b) ist also die Vereinigung von $a->difference($b) und $b->difference($a). Damit ist auch klar, dass $a->unique($b) identisch ist mit $b->unique($a). Du wolltest aber, wenn ich das richtig sehe, die beiden Differenzen getrennt haben in @db und @fs, und nicht beide zusammengeworfen.

Dank Überladen von Operatoren in CPAN:Set::Scalar kann man die Differenzen auch als $a - $b bzw. $b - $a schreiben. Ich finde die Methoden-Schreibweise aber etwas verständlicher.

Quote
[...] "tie" erübrigt sich also für mich, wenn ich das richtig sehe, aber ich werde es sicher in Zukunft mal brauchen können :)

Wenn du die Daten ohnehin schon in Arrays hast, brauchst du kein tie, richtig. Dann geht es auch schneller.

Quote
Das Beispiel von Dubu sieht sehr simpel aber effizient aus (oder einfach besonders einfach für einen Perl-DAU wie mich :))
Aber könnte ich nicht einfach gerade schreiben:
Code: (dl )
1
2
my @db = $nachher->unique($vorher)->members;
my @fs = $vorher->unique($nachher)->members;

Wie oben schon gesagt: die beiden Ergebnisse wären gleich.

View full thread Hilfe für Regex