linux-l: An die Perl-Könner ;-)....

Robert C. Helling helling at aei-potsdam.mpg.de
Di Mai 18 12:12:41 CEST 1999


On Tue, 18 May 1999, Thomas wrote:

> Hallöhchen,
> ist sicher nur eine einfache Funktion aber ich bekomme sie einfach nicht
> hin !!!! (Anfänger!)
> Wie schaff ich es mittels Perl eine Liste zu sortieren ???? Die Liste
> besteht aus 4 Spalten und ich will sie nach der 2. Spalte sortieren lassen
> und wenn es geht dann noch nach der 1. Spalte ;-) aber auf jeden Fall
> erstmal nach der 2. Spalte !
> Aber Perl versteht ja nun unter Tabellen eher Listen also kann ich auf die
> Tabelle nun nicht einfach "sort" anwenden !?
> Also "einfach" die Tabelle aus einer Txt-Datei einlesen (Spalten sind durch
> ; getrennt) , das müßt ja dann ein assoziatives Array werden oder ?
> Dann nach der 2. Spalte sortieren (??????) und wieder als Tabelle ausgeben
> , also die Einträge wieder in eine andere Datei schreiben (das geht ja noch
> ;-) ) .
> 

Auch wenn es schon eine Anwort gegeben hat, will ich noch mal meinen Senf
dauz geben: Wenn Du die Tabelle in Perl weiterverwenden willst, ist es
praktischer, sie in einem Perl-typischeren Fromat abzulegen, naemlich als
eine Liste von Listen (Stichwort: Array of arrays, siehe Camel-Buch Ch 4
p265). Genauer gesagt ist das eine Liste von Referenzen auf Listen. Das
einlesen funktioniert dann wie ueblich

@tabelle = ();
open (IN, "filename.txt") || die "Something's wrong! $!\n";
while(<IN>){
	push @tabelle, [ split /;/ ];   # oder was immer Dein Trenner ist
}

Wenn Du das hast mit einer custom-Vergelichsroutine sortieren. Zunaechst
der Vergleich

sub compare{
    return(($$a[1] cmp $$b[1]) or ($$a[0] cmp $$b[0]));
}

Ich nehme mal an, dass Du bei Deiner Spaltenzaehlung mit 1 und nicht wie
Perl bei 0 angefangen hast. Das obige Konstrukt mit dem or ist ein wenig
tricky, da es das zweite cmp nur auswertet, wenn das erste = ergeben hat.
Ich habe hier alphabetisch sortiert. Wenn Du es lieber numerisch haben
willst, musst Du die cmp's durch <=> ersetzen. So, jetzt fehlt nur noch
der eigentliche Aufruf zum Sortieren:

@tabelle = sort compare @tabelle;

Et voila!

Robert

.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oO
Robert C. Helling        Albert Einstein Institut Potsdam
                         Max Planck Institute For Gravitational Physics
print "Just another      Fon +49 331 275 37 60 Fax +49 331 275 37 99      
       stupid .sig\n";	 http://www.aei-potsdam.mpg.de/~helling



Mehr Informationen über die Mailingliste linux-l