mir ist da heute so ein schreckliches Stück Code eingefallen, das ich aus nem Gespräch mit nem Kolegen entworfen habe.
Der sagte zu mir: "Da liest Du die Datei ein, entfernst das \n am Ende, machst ein Leerzeichen daraus, schreibst die Zeile in ein Hash und zählst den Counter eins hoch".
Und weil ich gerade Urlaubsende habe und eh noch nicht so motivert (...), dachte ich mir mal, schreibst was, was er zwar versteht, aber nicht versteht. Äh, wie?
Also:
open ($in,'<','test.txt') || die ("Datei existiert nicht");
tr/\n/ / and print "$_" and $hash{$_}=1 and $cou++ while (<$in>);
Der sah sich das so an und sagte nur "Englisch kann ich selber"... Als das Ganze dann auch noch funktionierte, war der Lacher dann auf meiner Seite.
Und warum funktioniert es nun?
Als das mit dem Datei-Öffnen laß ich mal jetzt weg, das kann wohl inzwischen jeder.
Interessant ist eigentlich nur die Zeile
tr/\n/ / and print "$_" and $hash{$_}=1 and $cou++ while (<$in>);
Jeder Befehl für sich ist auch klar, aber in dieser Aufstellung? Denn so als deutscher ist man ja dazu verleitet, es erstmal zu übersetzen, und zwar mit
Entferne das \n, mach 'n Leerzeichen draus UND schreibe es UND lege es in ein Hash UND erhöhe den Zähler, und das für alle Zeilen der Datei.
Yo, sag ich doch, genau so wie vom Kollegen gefordert.
Der Witz bei der Sache ist der, daß die and's die einzelnen Befehle aneinander binden, und zwar so lange, bis ein Befehl nicht wahr ist.
Das anfängliche tr ersetzt also das \n, und da jede Zeile ein \n am Ende besitzt, ist das true. Dann kommt das print, das an sich auch immer true ist, dann der Hash und das $cou++. Es werden also alle Befehle nacheinander durchgerattert.
Sicherlich kein schönes Stück Code, im echten Leben würde ich es so auch nicht einsetzen, aber mal so zur Aufheiterung bestimmt nicht schlecht.
Kommentare zum Beitrag "Interessante Schreibweisen in Perl"
Kommentar von Bock
Die mehrzahl von and ist ands, nicht and's.
Wahrlich würde nicht mal ein verkorkster Engländer das so schreiben.
Kommentar von McGonagall
Beim Shell-Skripting ist solche bedingte Abarbeitung von mehreren Statements sehr gängig.