Siechfred: Spalten sortieren

Beitrag lesen

Tag jonny.

In $_ steht jede volle Zeile aus @zeilen, so wie es auch bei einem normalen Schleifendurchgang der Fall ist "while(<>) {}" und es werden anonyme Arrays gebildet [], genau genommen zwei, nämlich $a->[0] und $a->[1].

Ich habe es mir bildlich als ein anonymes mehrdimensionales Array vorgestellt, also ein Array, dessen Elemente wiederum Arrays sind. Ich nehme mal die ersten zwei Zeilen aus deinem Ausgangsposting:

Spalte 0   1    2    3  4  5
----------------------------
20041215  2.3 812.2 48 32 20
20041215 31.9  12.2 34 12 54

Das letzte map macht daraus quasi ein anonymes mehrdimensionales Array:

diesen Teil nenne ich »Elementarray«
           ----------------------------------------------
Liste[0] = [ Array[ Zeile 1, Spalte Nr. 3 aus Zeile 1 ] ]
         = [ "20041215 2.3 812.2 48 32 20", "48" ]
Liste[1] = [ Array[ Zeile 2, Spalte Nr. 3 aus Zeile 2 ] ]
         = [ "20041215 31.9 12.2 34 12 54", "34" ]

$a->[0] ist das erste Element des Elementarrays und hat die gesamte Zeile als Inhalt ($_), $a->[1] ist das zweite und hat nur das gesuchte Feld als Inhalt. Man könnte es auch so schreiben:

$Liste[0][0] entspricht $a->[0] entspricht $_
$Liste[0][1] entspricht $a->[1] entspricht dem Ergebnis der split-Anweisung

Die Reihenfolge, in der die Elemente im Elementarray abgelegt werden, bestimmt die map-Anweisung.

In $a->[0] befindet sich der Inhalt ausser $nr.

Nein, die _komplette_ Zeile (repräsentiert durch $_), wie du oben siehst.

In in $a->[1] befindet sich der Inhalt der split $nr Operation, also die Spalte, die ich sortieren möchte. Mit der Sortierung in $a->[1] wird auch die Reihenfolge der Zeilen in In $a->[0] angepasst.

Genau, denn sortiert wird nicht das Elementarray »Array«, sondern »Liste«, Sortierkriterium ist dabei das zweite Element von »Array«, deshalb $a->[1].

wie du schon schriebst, wird hier das Ergebnis der Sortierung wieder an $_ zurückgegeben, also die sortierte Spalte wird wieder an ihre position gebracht.

Die anonyme Liste wird quasi aufgelöst, sodass am Ende vom nunmehr sortierten mehrdimensionalen anonymen Array nur ein einfacher Array »@sortiert« übrig bleibt, dessen Elemente jeweils eine vollständige Zeile enthalten, sortiert nach Spalte 3. $a->[1] wurde nur für die Sortierung benötigt und wird durch die obere map-Anweisung sozusagen eliminiert, da es nicht mehr gebraucht wird. Da diese map-Anweisung auf alle Listenelemente angewandt werden soll, muss die Liste Element für Element durchgegangen werden, deshalb kommt hier die vordefinierte Variable $_ (das jeweils aktuelle Element) zur Anwendung.

Ich hoffe, dass ich mich einigermaßen verständlich ausgedrückt habe :-)

Siechfred

--
»Sie kochten heimlich mit Wasser und tranken öffentlich Wein.«