Holger A.: Sortieren einer Tabelle

Hallo zusammen,

Hab da schon wieder ein Problem, an dem ich nun 3 Tage
schon herum mache.
Ich möchte eine Tabelle nach Zahlen sortieren.

my @unsortiert = sort {(split(//,$a))[4] cmp (split(//,$b))[4]} besucher;
@sortiert = reverse @unsortiert;

Dieser Sortiert natürlich die Tabelle nach der 5. Spalte.
So sollte das Ergebniss ausehen:
40
39
38
20
19
13
12
12
9
5
4
3
2
1
und so siehts aus aus wenns der sort Befehl von oben es ausführt.
9
5
4
40
3
39
38
2
20
1
19
13
12
12

Was mache ich Falsch ?

Vielen Dank für eure Antworten

Gruss Holger A.

  1. Hallo Holger,

    my @unsortiert = sort {(split(//,$a))[4] cmp (split(//,$b))[4]} besucher;
    @sortiert = reverse @unsortiert;           ^.........1)            ^..........2)

    ^..........3)

    Da kann ich Dir hoffentlich helfen ;-)

    1. Verwende einfach statt cmp (Stringvergleich) <=> (numerischer Vergleich)
    2. fehlt hier nicht ein Ed? ;-)
    3. reverse kannst Du Dir ersparen, wenn Du $a und $b vertauschst. Dann ist @unsortiert (was ja eigentlich nicht stimmt ;-) in absteigender Reihenfolge sortiert.

    Gruß AlexBausW

    1. Hallo Holger, Alex

      Hallo Holger,

      my @unsortiert = sort {(split(//,$a))[4] cmp (split(//,$b))
      [4]} besucher;
      @sortiert = reverse @unsortiert;           ^.........1)            ^..........2)
                     ^..........3)

      Da kann ich Dir hoffentlich helfen ;-)

      1. Verwende einfach statt cmp (Stringvergleich) <=> (numerischer
        Vergleich)
      2. fehlt hier nicht ein Ed? ;-)
      3. reverse kannst Du Dir ersparen, wenn Du $a und $b vertauschst.
        Dann ist @unsortiert (was ja eigentlich nicht stimmt ;-) in
        absteigender Reihenfolge sortiert.

      Zusaetzlich dazu sollte man noch sagen, dass man das split ausserhalb
      des sort Blocks vornehmen sollte, da dieser sehr haeufig durchlaufen werden kann.

      Hier kann man sich die Schwartz'sche Transformation zur Hilfe nehmen
      s. perldoc -q sort / perlfaq4
      How can I sort a array by (anything)

      Bei Deinem Beispiel wuerde das dann so aussehen:

      my @sortiert= map {$_->[0]}                        
                    sort {$b->[1] <=> $a->[1]}            
             map { [$_, (split //,$_)[4] ] } @besucher;

      Gruß AlexBausW

      Gruss
         Kai

  2. Hallo Holger,

    my @unsortiert = sort {(split(//,$a))[4] cmp (split(//,$b))[4]} besucher;

    @sortiert = sort {(split(//,$b))[4] <=> (split(//,$a))[4]} besucher;

    Johannes

  3. Ja, jetzt tut‚s.

    Vielen Dank für die schnellen Antworten.

    Gruß Holger A.