Hash nach Werten sortieren

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);