Drex: Sortieren einer Tabelle nach mehreren Feldern

Ich möchte eine Fussballtabelle sortieren, jedoch ist das leider nicht
so leicht, wie ich gehoft habe :-(
Ausserdem, muss ich dazu sagen, das dies mein erstes Perl-Programm ist,
also nicht schrecken, wenn manches vielleicht einfacher geht.

Meine Tabelle besteht aus:

Mannschaft|Spielanzahl .. sonstiges .. |Tordifferenz|Punkte

Folgender Code liest (bis jetzt) die Tabelle aus einer Textdatei,
sortiert sie nach Punkten (15. Spalte) und speichert die geordnete
Liste wieder im Textfile ab.

Nun muss ich aber die Tabelle noch mal sortieren, jedoch nur die Zeilen,
wo die Punktezahl gleich ist soll nach der Tordifferenz (14. Spalte)
sortiert werden. Das heist, wenn die ersten drei Mannschaften 9 Punkte
haben, müssen sie nach der Tordifferenz sortiert werden. Wer die
größte Zahl als Tordifferenz hat steht ganz oben. Das gleiche bei allen
darunterliegenden Mannschaften, die Punkte vergleichen und bei gleicher
Punktzahl nach der Tordifferenz sortieren.

Dazu brauch ich einen Algorithmus, der Zeile für Zeile liest, die Punkte
vergleicht, und wenn Zeilen die gleiche Punkteanzahl haben, die Zeilen
in eine neue Liste wirft, welche ich dann wieder mit "sort" nach
Tordifferenz sortiere und neu geordnet in die alte Liste zurück schreibe.
Hört sich alles recht schön an, meine Theorie, aber wie verwirkliche
ich diesen Algo? Hört sich nach einem Schleifengewirr an?

Bin für jede Hilfe dankbar. Ich hoffe jemand kann mir helfen.

#Tabelle sortieren
sub tabelle_sortieren
{
 #Speicher für alle Mannschaften
 my @Mannschaften;

#Speicher für alle Mannschaften in Liste
 my @Mannschaften_Liste;

#Speicher für eine Mannschaft
 my @Mannschaft;

#Anzahl der Mannschaften
 my $mannschaften_anzahl = 0;

#Zähler
 my $i = 0;

#Tabellenfile öffnen
 open (TABELLE , "<$tabellen_file") || die "Kann die Datei ($tabellen_file) nicht zum Lesen öffnen.";

#Zähler reseten
 $i=0;

#solange Daten im Tabellenfile sind
 while (<TABELLE>)
 {
  #Mannschaften in @Mannschaften einlesen
  $Mannschaften[$i] = $_;

#Zähler erhöhen
  $i++;
 }

#Tabellenfile schließen
 close (TABELLE);

#Anzahl der Mannschaften setzen
 $mannschaften_anzahl = i;

#solange Mannschaften in @Mannschaften sind
 foreach $mannschaften_line (@Mannschaften)
 {
  #aktuelle Mannschaft aufdröseln
  @Mannschaft = split(/|/,$mannschaften_line);

#Mannschaften als Liste in Liste legen
  push (@Mannschaften_Liste, [ @Mannschaft ] );
        }

#Mannschaften_Liste sortieren nach Punkte
 @Mannschaften_Liste = sort { $b->[14] <=> $a->[14] } @Mannschaften_Liste;

##########################################
 ##
 ## hier fehlt leider das Entscheidende :-(
 ##
 ##########################################

#Tabellenfile öffnen
 open (TABELLE , ">$tabellen_file") || die "Kann die Datei ($tabellen_file) nicht zum Schreiben öffnen.";

#Zähler reseten
 $i=0;

#solange Mannschaften in @Mannschaften_Liste sind
 for(@Mannschaften_Liste)
 {
  #aktuelle Mannschaft in Datei schreiben
  print TABELLE "$Mannschaften_Liste[$i][0]|$Mannschaften_Liste[$i][1]|$Mannschaften_Liste[$i][2]|$Mannschaften_Liste[$i][3]|$Mannschaften_Liste[$i][4]|$Mannschaften_Liste[$i][5]|$Mannschaften_Liste[$i][6]|$Mannschaften_Liste[$i][7]|$Mannschaften_Liste[$i][8]|$Mannschaften_Liste[$i][9]|$Mannschaften_Liste[$i][10]|$Mannschaften_Liste[$i][11]|$Mannschaften_Liste[$i][12]|$Mannschaften_Liste[$i][13]|$Mannschaften_Liste[$i][14]";

#Zähler erhöhen
  $i++;
 }

#Tabellenfile schließen
 close (TABELLE);
}

  1. Hi,

    Ausserdem, muss ich dazu sagen, das dies mein erstes Perl-Programm ist,

    Na dafür haste aber so richtig reingelangt :)

    http://www.perl.com/CPAN-local/doc/FMTEYEWTK/sort.html

    o.g. Link findest du in der perldoc -perlfaq4 ...

    Have Fun; Rolf