Torwächter: if {dann sortieren nach x} else {sortieren nach dem y}

Hallo zusammen,

ich sortiere so:
for(sort {$upsortierennach{$b} <=> $upsortierennach{$a}} keys %upsortierennach)

und das funzt auch super bei Zahlen, doch nun mein Problem:

ich möchte bei Event A nach 1ner Zahl sortieren (if)
und bei Event B nach 2 Zahlen (elsif)
und bei Event C nach Buchstaben (else)

aber ich möchte den ganzen Block (for) nicht 3 (oder mehr)mal schreiben müssen.

aber so kann ich es ja nicht machen :

if(A)
{
  for(sort...)
  {
}
elsif(B)
{
  for(sort...)
  {
}
else
{
  for(sort...)
  {
}

BLOCK #Anweisungen aller Art
  BLOCK #Anweisungen aller Art
  BLOCK #Anweisungen aller Art
  }

Und wie kann ich überhaupt nach Buchstaben (Namen von AAl bis Zorro)
sortieren ?

Ich bitte um eure Hilfe. Vielen Dank

Greetings
Torwächter

  1. use Mosche;

    ich sortiere so:
    for(sort {$upsortierennach{$b} <=> $upsortierennach{$a}} keys %upsortierennach)

    und das funzt auch super bei Zahlen, doch nun mein Problem:

    ich möchte bei Event A nach 1ner Zahl sortieren (if)
    und bei Event B nach 2 Zahlen (elsif)

    » und bei Event C nach Buchstaben (else)

    aber ich möchte den ganzen Block (for) nicht 3 (oder mehr)mal schreiben müssen.

    for (sort deine_sort_sub keys %upsortierennach) {
     ###
    }

    sub deine_sort_sub {
      if ($A) {
        return $a <=> $b;
      } elseif ($B) {
        return $b <=> $a;
      } else {
        return $a cmp $b;
      }
    }

    Und wie kann ich überhaupt nach Buchstaben (Namen von AAl bis Zorro)
    sortieren ?

    Standardmäßig (d.h., wenn du keinen Sortiercode vorgibst), sortiert Perl nach Zeichen (Buchstaben). Du kannst das aber explizit angeben mitdem 'cmp' Operator, der genauso zu verwenden ist wie der '<=>'-Operator, aber eben für Zeichen.

    use Tschoe qw(Matti);

    1. Hallo,

      erstmal vielen Dank, funzt sehr gut.
      Aber auch so ? :
              sub readCookietoSort
              {
                      if($FanArtCookie eq "s") # Autoren
                      {
                              return sort {$uppunkteB{$b} <=> $uppunkteB{$a}} keys %uppunkteB
                      }
                      elsif($FanArtCookie eq "p") # Stimmen
                      {
                              return sort {$uppunkteB{$b} <=> $uppunkteB{$a}} keys %uppunkteB
                      }
                      elsif($FanArtCookie eq "d") # Punkte
                      {
                              return sort {$uppunkteB{$b} <=> $uppunkteB{$a}} keys %uppunkteB
                      }
                      else # Durchschnitt
                      {
                              return sort {$uppunkteB{$b} <=> $uppunkteB{$a}} keys %uppunkteB
                      }
              }
              #---
              for( readCookietoSort )          #<--- Beachte diese Zeilte
              {
              }

      (ist zur Zeit alles die gleiche Anweisung aber es geht ja um die Funktion :) )

      Danke im Voraus.

      Greetings
      Torwächter

      1. use Mosche;

        erstmal vielen Dank, funzt sehr gut.
        Aber auch so ? :

        for( readCookietoSort )          #<--- Beachte diese Zeilte

        Ich denke nicht, dass das laufen wird, weil du die Funktion sort {} () nicht benutzt. Erst sort() belegt die Variablen $a und $b, deswegen musst du sie auch benutzen. Wenn du diese Funktion definierst, macht sie das gleiche wie

        @arr = sort {
            if ($A) {
              return $a <=> $b;
            #} elseif ($B) { ...
            } else {
              return $a cmp $b;
            }
          } @arr_unsorted;

        use Tschoe qw(Matti);

        1. die if..else Anweisung sollte doch mit "return" ebefalls das sort zurückgeben (beachte doch den oberen Block :) )

          Oder nicht ?

          Greetings
          Torwächter

          1. Hallo,

            du hast mich auf die richtige Idee gebracht mit subs zu arbeiten.

            ich mache es nun so:

            if(A)
            {
             for{sort...)
             {
              dasblocksub()
             }
            }
            else
            .
            .
            .

            Danke dir.

            Greetings
            Torwächter