LanX: Sortiere Array of Hashes nach bestimmten Hashvalue

Hallo Leute

mal wieder ne Anfängerfrage
(Hi nd, Hi Chea*was auch mimmerdas bedeutet*tah)

mit

sort sortfunction @array

kann man bekanntermaßen ein Array nach eigenen Kriterien durchsuchen,
dabei werden sortfunction() beliebige $a,$b übergeben und der returnwert
entscheidet, ob gleich kleiner größer.

OK

Aber was is wenn ich ein Array von Hashes habe und nach einem bestimmten
Hashvalue sortieren will?

z.B. array[$i]{'key1'}="value" ich will das array alphabetisch nach dem
Inhalt bei 'key1' sortieren!

Ich habe versucht die sortfunction entsprechend zu schreiben, versage
aber irgendwie beim klammern ;)

sowas wie

{
 %{$a}{'key1'} cmp %{$b}{'key1'}
}

klappt nicht! ... 'Can't use subscript on hash deref ...'

dafüer klappt mittlerweile [1]
  {
    %ha=%$a;%hb=%$b;
    $ha{"key1"} cmp $hb{"key1"};
  }

Kann mir jmd bitte bitte erklären wieso?

Tschuess Rolf

[1] als ich dieses Posting begann hats noch nicht gefunkt ;)

  1. Moin,

    z.B. array[$i]{'key1'}="value" ich will das array alphabetisch nach dem
    Inhalt bei 'key1' sortieren!

    my @sorted = sort {$a->{key1} cmp $b->{key1}} @array;

    etwa so, wuerde ich sagen - ungetestet ;)

    Viele Gruesse,

    n.d.p.

    1. ReMoin,

      my @sorted = sort {$a->{'key1'} cmp $b->{'key1'}} @array;

      Ja klappt! :)

      Viele Gruesse,

      Rolf

  2. Tach auch!

    {
    %{$a}{'key1'} cmp %{$b}{'key1'}
    }

    Das Zeichen ganz vorne bei der Derefernzierung gibt den Datentyp an, der letztlich entstehen soll. Oder sagen wir's anders: Wenn Du auf key1 im Hash %hash zugreifen willst, schreibst Du ja auch $hash{'key1'} und nicht %hash{'key1'}. Da ist Perl immerhin konsistent, richtig waere also ${$a}{'key1'}. Da die geschweiften Klammern aber sowieso klarmachen, dass das was davor steht, ein Hash sein soll, kannst Du auch einfach $a->{'key1'} schreiben. Diesmal ist das $-Zeichen aber das ganz normale von $a (was ein Skalar (im speziellen eine Hashreferenz) ist). Das letztlich auch ein Skalar rauskommt, ist hier dadurch klar, dass in einem Hash unter einem bestimmten Key nunmal Skalare gepeichert werden. Wichtig ist bei $a->{'key1'} auf jeden Fall der -> Operator, denn der zeigt an, dass $a eine Referenz ist, die dereferenziert werden soll. (Wenn's am Ende in Wirklichkeit gar keine Ref ist, gibt's wieder ne Fehlermeldung.)

    So long

    1. Tach zurück!

      Das Zeichen ganz vorne bei der Derefernzierung gibt den Datentyp an, der letztlich entstehen soll. Oder sagen wir's anders: Wenn Du auf key1 im Hash %hash zugreifen willst, schreibst Du ja auch $hash{'key1'} und nicht %hash{'key1'}.

      Sch****, irgenwie logisch, danke für den Tip!

      Cheers
      Rolf

    2. Hi again,

      {
      %{$a}{'key1'} cmp %{$b}{'key1'}
      }

      Ach, jetzt fällts mir wieder ein, das hab ich aus selfhtml übernommen
      </selfhtml/tgcb.htm#a4>

      Hab ich dort was falsch verstanden oder haben wir einen
      Korrekturvorschlag für die V8 ;)

      Viele Grüße
      Rolf

      1. Re-Hi!

        Ach, jetzt fällts mir wieder ein, das hab ich aus selfhtml übernommen
        </selfhtml/tgcb.htm#a4>
        Hab ich dort was falsch verstanden oder haben wir einen
        Korrekturvorschlag für die V8 ;)

        Yoh, sieht falsch aus. Aber Selfhtml ist zum Perl lernen sowieso nicht zu empfehlen, eher ist sogar dringend davon abzuraten. Naja, das aendert sich sicher mit der Version 8.

        So long

        1. Hi^3,

          Aber Selfhtml ist zum Perl lernen sowieso nicht zu empfehlen,

          Ja da sind wir uns einig, so gut der Rest auch sei.
          Andererseits war das dereferenzieren auch schön knapp erklärt :)

          Bye Bye
          Rolf