Hash nach Werten sortieren
am 26.07.2006 10:49:08 von keanu.raciborski
Hallo NG,
wie sortiere ich Hashs nach Werten, wenn diese die folgende Struktur
haben?
$data {$nname} {"nodeID"} =3D $nodeID;
$data {$nname} {"nodeName"} =3D $nodeName;
$data {$nname} {"ip"} =3D $ip;
Dabei ist $nname der Schlüssel ;)
Sortieren möchte ich zum Beispiel alphabetisch nach nodeID oder
nodeName. Nur weiß ich leider nicht wie ich die sort Funktion dazu
benutzen muss. Die Perl-Kochbücher haben da auch nicht geholfen.
Mit freundlichen Grüßen,
Keanu
Re: Hash nach Werten sortieren
am 26.07.2006 11:58:50 von Christian Kirsch
keanu.raciborski@gmx.net schrieb:
> Hallo NG,
>
> wie sortiere ich Hashs nach Werten, wenn diese die folgende Struktur
> haben?
>
> $data {$nname} {"nodeID"} = $nodeID;
> $data {$nname} {"nodeName"} = $nodeName;
> $data {$nname} {"ip"} = $ip;
>
> Dabei ist $nname der Schlüssel ;)
>
> Sortieren möchte ich zum Beispiel alphabetisch nach nodeID oder
> nodeName. Nur weiß ich leider nicht wie ich die sort Funktion dazu
> benutzen muss. Die Perl-Kochbücher haben da auch nicht geholfen.
>
So ungefähr?
sort { $data{$a}{'nodeID'} cmp $data{$b}{'nodeID'} } keys %data
Re: Hash nach Werten sortieren
am 26.07.2006 11:59:33 von Wolf Behrenhoff
keanu.raciborski@gmx.net schrieb:
> Hallo NG,
>
> wie sortiere ich Hashs nach Werten, wenn diese die folgende Struktur
> haben?
Ein Hash ist per Definition unsortiert.
> $data {$nname} {"nodeID"} = $nodeID;
> $data {$nname} {"nodeName"} = $nodeName;
> $data {$nname} {"ip"} = $ip;
>
> Dabei ist $nname der Schlüssel ;)
>
> Sortieren möchte ich zum Beispiel alphabetisch nach nodeID oder
> nodeName. Nur weiß ich leider nicht wie ich die sort Funktion dazu
> benutzen muss. Die Perl-Kochbücher haben da auch nicht geholfen.
Du kannst einen Hash nicht sortieren. Das einzige, was du machen kannst,
ist die Ausgabe zu sortieren.
Du hast hier ja einen Hash of Hashes. Wie willst du das denn genau
sortieren? Bzw. willst du gleich alles ausgeben? Willst du nach den
Schlüsseln sortieren oder nach den Werten?
Generell kannst du ein Konstrukt wie
for (sort {vergleichsfunktion} keys %hash) { ... }
einen Hash sortiert ausgeben.
Möchtest du oben etwas wie
for (sort {$a cmp $b} keys %{$hash{$nname}}) { ... }
oder möchtest du so sortieren, dass du für alle $nname die nodeIDs
sortierst? Dann wäre es eher
for (sort {$hash{$a}{"nodeID"} cmp $hash{$b}{"nodeID"}} keys %hash)
{ ... }
Wolf
Re: Hash nach Werten sortieren
am 26.07.2006 12:05:52 von Ingo Menger
keanu.raciborski@gmx.net wrote:
> Hallo NG,
>
> wie sortiere ich Hashs nach Werten, wenn diese die folgende Struktur
> haben?
>
> $data {$nname} {"nodeID"} =3D $nodeID;
> $data {$nname} {"nodeName"} =3D $nodeName;
> $data {$nname} {"ip"} =3D $ip;
>
> Dabei ist $nname der Schlüssel ;)
>
> Sortieren möchte ich zum Beispiel alphabetisch nach nodeID oder
> nodeName. Nur weiß ich leider nicht wie ich die sort Funktion dazu
> benutzen muss. Die Perl-Kochbücher haben da auch nicht geholfen.
Kurze Antwort: Man kann Hashs nicht sortieren.
Lange Antwort: Wahrscheinlich möchtest Du ein Array von Strings
sortieren (nämlich die Schlüssel für Deinen Hash). Und zwar nicht
alphabetisch, sondern abhängig von den Ordnungsbeziehungen, die
zwischen den Objekten besteht, die unter dem entsprechenden Schlüssel
in dem Hash stehen.
In deinem Hash %data stehen nun als Werte Objekte der folgenden Art:
{ nodeID =3D> ..., nodeName =3D> ..., ip =3D> ... }
(also Referenzen auf anonyme Hashs mit den angegebenen Schlüsseln.)
Wenn wir nun eine Funktion hätten, wie
sub objcmp {
my ($href1, $href2) =3D @_;
return $href1->{"nodeID"} cmp $href2->{"nodeID"};
}
dann könnten wir 2 Deiner Objekte bezüglich nodeID vergleichen.
Das wiederum würde uns in die Lage versetzen, ein Array solcher
Objekte zu sortieren:
@sortedvalues =3D sort \&objcmp (values %data);
Jetzt willst Du wahrscheinlich aber eben nicht die Objekte selbst
sortieren, sondern die Schlüssel:
@sortedkeys =3D sort { objcmp($data{$a}, $data{$b}) } (keys %data);