Ich habe etwas Code von einem Typen geerbt, dessen Lieblingszeit es war, jede Zeile auf das absolute Minimum zu verkürzen (und manchmal nur, damit es cool aussieht). Sein Code ist schwer zu verstehen, aber ich habe das meiste davon verstanden (und neu geschrieben).
Nun bin ich auf einen Code gestoßen, den ich, egal wie sehr ich es versuche, nicht verstehen kann.
%Vor% Von dem, was ich verstehen kann, soll dies eine Art Randomizer sein, aber ich habe nie einen komplexeren Weg gesehen, um Zufälligkeit zu erreichen. Oder sind meine Annahmen falsch? Zumindest sollte das der Code tun. Wähle 2 zufällige Dateien und kopiere sie.=== ANMERKUNGEN ===
Das OSA-Framework ist ein eigener Rahmen. Sie sind nach ihren UNIX-Gegenstücken benannt und führen einige grundlegende Tests durch, damit sich die Anwendung nicht darum kümmern muss.
Das sieht aus wie ein C-Code mit Perl-Syntax. Manchmal hilft es, die Sprache zu verstehen, in der die Person denkt, um herauszufinden, was vor sich geht. In diesem Fall ist das Gehirn der Person mit der inneren Funktionsweise von Speicherverwaltung, Zeigerarithmetik und anderen Problemen auf niedriger Ebene infiziert, so dass er alles genau steuern möchte:
%Vor%Das ist eine Menge Arbeit, weil der ursprüngliche Programmierer die Hashes entweder nicht versteht oder nicht mag.
%Vor%Wenn Sie Hashes immer noch hassen und Perl 5.10 oder höher verwenden, können Sie mithilfe von Smart-Matching überprüfen, ob ein Wert in einem Array enthalten ist:
%Vor%Sie haben jedoch eine spezielle Einschränkung für dieses Problem. Da Sie wissen, dass es nur zwei Elemente gibt, müssen Sie nur prüfen, ob das Element, das Sie hinzufügen möchten, das vorherige Element ist. Im ersten Fall ist es nicht undef, so dass die erste Addition immer funktioniert. Im zweiten Fall kann es nicht das letzte Element im Array sein:
%Vor% Huh. Ich kann mich nicht erinnern, wann ich zum letzten Mal until
benutzt habe, als es tatsächlich zu dem Problem passte. :)
Beachten Sie, dass alle diese Lösungen das Problem haben, dass sie eine Endlosschleife verursachen können, wenn die Anzahl der Originaldateien kleiner als 2 ist. Ich würde eine Schutzbedingung höher hinzufügen, so dass die Fälle no und single file durch einen Fehler und vielleicht kümmert sich der Fall mit zwei Akten nicht darum, sie zu bestellen.
Sie können dies auch tun, indem Sie die gesamte Liste mischen (z. B. mit List :: Util ) von Originaldateien und nimm nur die ersten beiden Dateien ab:
%Vor%Er wählt ein zufälliges Element von @heads aus.
Dann fügt es ein weiteres zufälliges aber anderes Element von @heads hinzu (wenn es das zuvor ausgewählte Element ist, scrollt es durch @heads, bis es ein Element findet, das vorher nicht ausgewählt wurde).
Zusammenfassend wählt es N (in Ihrem Fall N = 2) verschiedene Zufallsindizes im @heads-Array und kopiert dann Dateien, die diesen Indizes entsprechen.
Ich persönlich würde es ein bisschen anders schreiben:
%Vor% Der Teil, den du mit "WTF" beschriftet hast, ist nicht so beunruhigend, es stellt lediglich sicher, dass $selected_heads[$i]
als gültiger Index von @head
übrig bleibt. Der wirklich beunruhigende Teil ist, dass es eine ziemlich ineffiziente Art ist, dafür zu sorgen, dass er nicht dieselbe Datei auswählt.
Wenn andererseits die Größe von @heads
klein ist, ist das Stepping von 0..$#heads
wahrscheinlich effizienter als das Erzeugen von int rand( 2 )
und das Testen, wenn sie gleich sind.
Aber im Grunde kopiert es zwei Dateien zufällig (warum?) als eine .txt-Datei und eine .cache-Datei.
Tags und Links perl