Tag jonny.
mein Vorhaben ist recht simple zu erklären. Ich habe eine Datei mit etlichen Daten in Tabellenform. [...] Nun möchte ich gerne die Daten nach einer bestimmten Spalte sortieren und das möglichst Dynamisch. Das heißt dem Script wird als Argument die Spaltennummer mitgegeben, nach der das Script sortieren soll.
Hm, das klingt nach der Schwartzschen Transformation. Das könnte vereinfacht so aussehen:
@sortiert = map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [ $_, (split / /)[$nr] ] } @zeilen;
Zur Erklärung (von unten nach oben):
Das letzte map erstellt aus deiner Gesamtliste @zeilen eine temporäre Liste aus anonymen (»namenlosen«) Arrays. In diesen anonymen Arrays werden das Originalelement ($_) sowie das gewünschte Feld abgelegt. Wesentlich ist hier zu wissen, dass »split / /« ein Array liefert, von dem du aber nur das Element »$nr« benötigst, nämlich die Spaltennummer, nach der sortiert werden soll (bedenke, dass das erste Element eines Arrays immer $arr[0], nicht $arr[1] ist, das musst du bei der Nummerierung der Spalten beachten).
Diese temporäre Liste wird mittels sort sortiert. Denke daran, durch die letzte map-Anweisung hat $a->[0] den Inhalt »$_«, in $a->[1] steht das Ergebnis der split-Operation, den Vergleichsoperator musst du natürlich typenabhängig wählen.
In der obersten map-Anweisung wird alles wieder sortiert zusammengefügt, hier mittels $_->[0] (das war die ganze Zeile, siehe meine Erklärung zum letzten map). Das Ergebnis ist eine Liste, sortiert nach Spaltennummer $nr.
Hm, hoffentlich habe ich nicht wieder was vergessen :-)
Siechfred
»Sie kochten heimlich mit Wasser und tranken öffentlich Wein.«