PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Perl] Problem mit interner Sortierung von Hashes



Rebell
21-08-2006, 11:42
Hallo.

Ich hab ein Problem damit, dass Perl die Hashes intern umsortiert ohne eine Möglichkeit die vorgegebene Reihenfolge zurück zu bekommen.

Beispiel:


my %werte = ("kuh", "muh", "katze", "miau", "hund", "wau", "broiler", "puttputt");
foreach my $key (keys(%werte)) {
print $key . "=>" . $werte{$key} . "\n";
}
print "---\n";
while (my ($key, $value) = each %werte) {
print $key . "=>" . $value . "\n";
}



hund=>wau
kuh=>muh
broiler=>puttputt
katze=>miau
---
hund=>wau
kuh=>muh
broiler=>puttputt
katze=>miau


Kann ich das irgendwie über ein Parameter oder interne Einstellung verhindern?
Einen Workarround mit Arrays zu schreiben hab ich versucht, ist aber Geschwindigkeitstechnisch nicht vertretbar.

michael.sprick
21-08-2006, 14:02
Ich hab ein Problem damit, dass Perl die Hashes intern umsortiert ohne eine Möglichkeit die vorgegebene Reihenfolge zurück zu bekommen.

Hi,

umsortiert ist nicht ganz richtig... Ein Hash ist in Perl uNsortiert . Die Reihenfolge der Elemente ist immer willkürlich.

Du kannst Dich aber selber um die Sortierung kümmern.

Alphanumerisch:


my %Hash = (
'hund' => 'wau',
'katze' => 'miau',
'kuh' => 'muh'
);

foreach(sort(keys(%Hash)))
{
print "$_ => $Hash{$_}\n";
}


oder nach Index:


my %Hash = (
'hund' => { 'index' => 0, 'value' => 'wau' },
'katze' => { 'index' => 1, 'value' => 'miau' },
'kuh' => { 'index' => 2, 'value' => 'muh' }
);

foreach( sort {$Hash{$a}{'index'} cmp $Hash{$b}{'index'}} keys(%Hash))
{
print "$_ macht $Hash{$_}{'value'} \n";
}


Wobei Du Dich um den Wert des Index selber kümmern musst... der wird nicht automatisch erzeugt, wie beispielsweise beim Füllen eines Arrays ;) Hier wäre dann aber sichergestellt (vorausgesetzt, der Index ist richtig), dass alle Elemente in der Reihenfolge ausgegeben werden, wie sie auch zugewiesen wurden.

...was übrigens nichts an der Tatsache ändert, dass das Hash intern immernoch unsortiert ist.

hth, michael

Rebell
21-08-2006, 15:59
Ja, das dachte ich mir schon. Ich bin es nur von PHP und Javascript gewöhnt, dass das Hash so bleibt wie ichs erzeugt habe.

Aber interessante Zeile die du da geschrieben hast mit sort() und keys(). Ist das eine Art Pipe-Funktionalität? Das cmp sorgt für die automatisch Sortierung nehm ich an?

michael.sprick
21-08-2006, 18:38
Ist das eine Art Pipe-Funktionalität?
Das ist eher ein zusammenhängender Funktionsaufruf von sort().

sort() kannst Du zwei Argumente übergeben. Die Sortierroutine und die Liste von Elementen, die sortiert werden soll.

Kurz geschrieben wäre der Aufruf eigentlich so:



@SortiertesArray = sort( {CODEBLOCK} , @UnsortiertesArray);


keys() wiederum ist eine Funktion, die eine Liste aller Schlüssel aus dem Hash zurückgibt. Das Pendant wäre dann values() ;)

Mehr dazu findest Du mit

perldoc -f sort
perldoc -f keys

reneeb
22-08-2006, 09:09
Ja, das dachte ich mir schon. Ich bin es nur von PHP und Javascript gewöhnt, dass das Hash so bleibt wie ichs erzeugt habe.
[...]

Dafür könntest Du das Modul Tie::IxHash verwenden...