2009-10-18T09:45:40
leo11Guest guest
perl -ne 'print if ($seen{$_}.=@ARGV) =~ /10$/' fileA fileB
Würde mal jemand die Funktionsweise erklären?
Ich kannte den auch noch nicht und hab tatsächlich ne ganze Weile hinstarren müssen, bis er sich mir erschlossen hat, daher schreib ich mal, wie er funktioniert:
Mit der Option "-n" wird über die Zeilen der ersten Datei aus @ARGV (also fileA) iteriert, nachdem dieser Dateiname aus @ARGV entfernt wurde. Wenn die Datei am Ende ist, wird die nächste aus @ARGV entfernt und dann wieder darüber iteriert (nun ist es fileB). An der aktuellen Größe von @ARGV -- entweder 0 oder 1 -- erkennt man also, in welcher Datei man gerade ist.
Die Größe von @ARGV wird an den Wert aus dem %seen-Hash angehängt. Ganz am Ende enthält
$seen{waldemar} also beispielsweise "11111000", wenn "waldemar" in der ersten Datei 5 mal und in der zweiten Datei 3 mal vorkommt. Die erste 0 wird angehängt beim ersten Antreffen der Zeile in der zweiten Datei. In diesem Moment matcht "10$" auf "111110", und die Zeile wird ausgegeben.
Krasses Ding irgendwie.. mir fällt aber gerade auch nichts wirklich kürzeres ein.
Update: Das Entfernen aus @ARGV richtiger beschrieben. Siehe auch "null filehandle" in perlop.
Last edited: 2009-10-18 12:57:42 +0200 (CEST)