perl: Wie sortiere ich einen Hash nach Werten?
Silvio
- perl
Hi,
wie kann ich die Schlüssel-Werte-Paare eines Hash ausgeben? Aber sortiert nach den Werten. Die Werte sind Strings.
Was mich noch wundert: ich befülle den Hash durch eine sortierte Eingabe, in dem ich aus einer Datenbank Werte sortiert auslese. Leider ist der Hash dann nicht mehr sortiert...
Danke Silvio
Hallo Silvio,
Was mich noch wundert: ich befülle den Hash durch eine sortierte Eingabe, in dem ich aus einer Datenbank Werte sortiert auslese. Leider ist der Hash dann nicht mehr sortiert...
Die Reihenfolge der Keys in einem Hash ist undefiniert. Technisch ist eine Hashtable eine Tabelle, bei dem der Index des Elements aus dem Schlüssel berechnet wird. Ein vereinfachtes Beispiel: der Key a
könnte z.B. den Index 1 ergeben, der Key b
z.B. den Index 2. Fügst du jetzt zuerst einen Wert mit dem Key b
ein, wird er an die Zelle 2 in der Tabelle eingefügt, auch wenn er als erstes hinzugefügt wurde.
wie kann ich die Schlüssel-Werte-Paare eines Hash ausgeben? Aber sortiert nach den Werten. Die Werte sind Strings.
Du loopst über die sortierte Liste der Keys:
foreach my $key (sort { $hash{$a} cmp $hash{$b} } keys %hash) {
printf "%s: %s\n", $key, $hash{$key};
}
LG,
CK
Perfekt, danke!
Das bedeutet aber, ich kann einen Hash nie sortiert speichern, sondern muss vor der Ausgabe jedes mal eine Sortierung vornehmen?
Danke!
Hallo Silvio,
Das bedeutet aber, ich kann einen Hash nie sortiert speichern, sondern muss vor der Ausgabe jedes mal eine Sortierung vornehmen?
Völlig richtig.
Wenn du die Sortierung vor der Ausgabe nicht vornehmen möchtest, musst du eine separate (sortierte) Liste der Keys beim Aufbau des Hashes erzeugen.
LG,
CK
Wenn Du schon ein sortiertes Array kriegst, ist es unsinnig daraus einen Hash zu machen. Also nimm das Array und guck Dir mal die Slice-Option an, siehe perldoc DBI.
MfG
PS: Dieselbe Antwort hab ich gerade eben auch ins Perlforum geschrieben.