Markus: Sortierung nach zwei Kriterien - wie nur?

Hallo,

ich habe folgenden Hash aus Namen, Zahlen definiert:

%ages = ('Rolf'=>2,'Erwin'=>1,'Otto'=>1,'Michael'=>1,'Uwe'=>1);

Ich möchte nun eine Ausgabe absteigend sortiert nach Zahlen. Bei gleicher Zahl soll dann auch Namen sortiert werden.

@keys = sort{$ages{$b}<=>$ages{$a}} keys %ages;

foreach $key (@keys)
{
 print "$key = $ages{$key}\n";
}

Ausgabe:
Rolf = 2
Michael = 1
Otto = 1
Erwin = 1
Uwe = 1

Wie bekomme ich aber das 2-te Sortierkriterium hin, um folgende Ausgabe zu bekommen:

Ausgabe:
Rolf = 2
Erwin = 1
Michael = 1
Otto = 1
Uwe = 1

Danke im voraus!

  1. Hallo Markus,

    Wie bekomme ich aber das 2-te Sortierkriterium hin, um folgende Ausgabe zu bekommen:

    mit einer simplen Oder Verknüpfung:

      
    @keys = sort{   $ages{$b}  <=> $ages{$a}  
                 || $names{$a} <=> $names{$b} } keys %ages;  
    
    

    siehe auch sort bei perldoc

    Gruß,
    Benne

    --
    ie:% fl:( br:> va:) ls:> fo:| rl:° ss:) de:[ js:| ch:| mo:} zu:)
    1. entschuldigt mich für den Fehler.

        
      @keys = sort{   $ages{$b}  <=> $ages{$a}  
                   || $names{$a} cmp $names{$b} } keys %ages;  
      
      

      muss das natürlich heißen

      Gruß,
      Benne

      --
      ie:% fl:( br:> va:) ls:> fo:| rl:° ss:) de:[ js:| ch:| mo:} zu:)
      1. hi Benne,

        danke dir vielmals!

        helau

        markus

    2. Hi Benne,

      ich habe dich zu früh gelobt. Es klappt leider nicht.

      %ages = ('Rolf'=>2,'Erwin'=>1,'Otto'=>1,'Michael'=>1,'Uwe'=>1);

      @keys = sort{$ages{$b}  <=> $ages{$a} || $names{$a} cmp $names{$b}} keys %ages;

      foreach $key (@keys)
      {
       print "$key = $ages{$key}\n";
      }

      Der Output ist wieder:
      Rolf = 2
      Michael = 1
      Otto = 1
      Erwin = 1
      Uwe = 1

      Ich möchte aber diesen Output haben:
      Rolf = 2
      Erwin = 1
      Michael = 1
      Otto = 1
      Uwe = 1

      Bei gleichen Zahlen soll auch nach Name sortiert werden.

      Weist du wo der Fehler ist?

      Bye

      Markus

  2. Wie bekomme ich aber das 2-te Sortierkriterium hin, um folgende Ausgabe zu bekommen:

    Ausgabe:
    Rolf = 2
    Erwin = 1
    Michael = 1
    Otto = 1
    Uwe = 1

    Ihr wart auf dem richtigen Weg:

    #!/usr/bin/perl -w  
    use strict;  
    my %ages = ('Rolf'=>2,'Erwin'=>1,'Otto'=>1,'Michael'=>1,'Uwe'=>1);  
    my @keys = sort{   $ages{$b}  <=> $ages{$a}  
                 || $a cmp $b } keys %ages;  
      
      
    foreach my $key (@keys)  
    {  
     print "$key = $ages{$key}\n";  
    }
    

    Struppi.

    1. Hi Struppi,

      tausend Dank an den Profi. Es klappt.