Torwächter: Sortieren (nicht gerade einfach)

Hallo zusammen,

mir wurde damals bei diesem Problem schon sehr gut geholfen, daher wende ich mich mit solch einem Problem auch wieder an euch:

ich habe eine Linkliste, in welcher Punkte vergeben werden können.
Die Links lasse ich dann so sortieren:

for (sort {$punktsorterA{$b} <=> $punktsorterA{$a}} keys %punktsorterA)
{

}

Hierbei werden aber nur nach punkten sortiert, was zur Folge hätte, dass mehrere auf Platz 1 landen könnten, daher habe ich das versucht:

for (sort {$punktsorterA{$b} <=> $punktsorterA{$a}} keys %punktsorterA)
{
  for (sort {$stimmensorterA{$b} <=> $stimmensorterA{$a}} keys %stimmensorterA)
  {
  }
}

Was aber nun bewirkt, dass bei 3 Links 9 angezeigt werden.

Was kann ich machen, dass erst nach Clicks, dann nach Stimmen sortiert wird ?

Vielen Dank im Voraus

Greetings
Torwächter

  1. Hallo,

    [... nach mehreren Kriterien sortieren ...]

    Die perlfaq haette dir weitergeholfen:

    my @double_sorted = sort {
      $hash->{$a}->{field1} <=> $hash->{$b}->{field1}
                     ||
      $hash->{$a}->{field2} cmp $hash->{$b}->{field2}
    } keys %{$hash};

    Natuerlich kannst du die Sortierung noch beliebig erweitern.

    Gruesse,
     CK

    1. Hi CK,

      nach ca 10 Minuten Codebetrachten hab ich verstanden, was das || da drin sucht :) man kann ja einfach schreiben :
      sort {$hash->{$a}->{field1} <=> $hash->{$b}->{field1} || $hash->{$a}->{field2} cmp $hash->{$b}->{field2}} keys %{$hash};

      Vielen Dank,

      Greetings
      Torwächter

      1. Ich hab nun das ganze soweit gekürzt :

        for (sort {$click{$b} <=> $click{$a} || $stimmen{$b} cmp $stimmen{$a}} keys %click)

        und es funzt.
        Doch mache ich mir gedanken, ob das %click vielleicht irgendwas durcheinander bringt ?

        Greetings
        Torwächter

        1. Hallo,

          Doch mache ich mir gedanken, ob das %click vielleicht irgendwas durcheinander
          bringt ?

          Durcheinander bringt?
          Es wird zuerst nach $click{$b} <=> $click{$a} sortiert, danach nach $stimmen{$b}
          cmp $stimmen{$a} (btw., wenn das ein numerischer Wert ist (danach hoert es sich
          an), wuerde ich <=> benutzen). Der Hash bleibt, wie er ist, die Keys in einem
          Hash haben keine definierte Reihenfolge.

          Gruesse,
           CK

          1. Ok, nun ersetzte ich nur noch cmp durch <=> und fertig.

            Vielen Dank, du hast mir sehr geholfen.

            Greetings
            Torwächter

      2. Hallo Torwaechter,

        nach ca 10 Minuten Codebetrachten hab ich verstanden, was das || da drin sucht
        :) man kann ja einfach schreiben :
        sort {$hash->{$a}->{field1} <=> $hash->{$b}->{field1} || $hash->{$a}->{field2} cmp $hash->{$b}->{field2}} keys %{$hash};

        Ich verstehe nicht. Wo ist das Problem mit dem Zeilenumbruch? Ein Block bleibt
        ein Block, ob mit oder ohne Zeilenumbruch...

        Gruesse,
         CK

        1. nur ich habe so noch nie die Zeile umgebrochen und bin davon ausgegangen, du willst damit sagen, Zeile 1 = Zeile 2 :)

          Greetings
          Torwächter