Ordered Hashes mit Tie::IxHash oder Tie::Hash::Indexed
Veröffentlicht von Thomas Fahle am (Permalink)
Wenn die Schlüssel und Werte eines Perl-Hashes genau in der Reihenfolge ausgegeben werden sollen, in der die Daten in den Hash eingefügt wurden, bieten sich die beiden CPAN-Module Tie::IxHash und Tie::Hash::Indexed an.
Standardverhalten von Perl-Hashes bei der Ausgabe
Schlüssel und Wert werden in nicht vorhersagbarer Reihenfolge ausgegeben.
#!/usr/bin/perl use warnings; use strict; my %farbe = (); $farbe{'Banane'} = 'Gelb'; $farbe{'Zitrone'} = 'Gelb'; $farbe{'Orange'} = 'Orange'; $farbe{'Apfel'} = 'Rot'; my $pattern = "%-20s %-20s\n"; printf( $pattern, 'Obst:', 'Farbe:' ); # Ausgabe in zufaelliger Reihenfolge foreach my $obst ( keys %farbe ) { printf( $pattern , $obst, $farbe{$obst} ); }
Das Programm erzeugt folgende Ausgabe:
Obst: Farbe: Banane Gelb Apfel Rot Orange Orange Zitrone Gelb
Tie::IxHash
Tie::IxHash von Gurusamy Sarathy gibt Schlüssel und Werte eines Hashes genau in der Reihenfolge wieder aus, in der die Schlüssel eingefügt wurden:
#!/usr/bin/perl use warnings; use strict; use Tie::IxHash; my %farbe = (); tie %farbe, "Tie::IxHash" or die $!; $farbe{'Banane'} = 'Gelb'; $farbe{'Zitrone'} = 'Gelb'; $farbe{'Orange'} = 'Orange'; $farbe{'Apfel'} = 'Rot'; my $pattern = "%-20s %-20s\n"; printf( $pattern, 'Obst:', 'Farbe:' ); # Ausgabe in Einfuege-Reihenfolge foreach my $obst ( keys %farbe ) { printf( $pattern , $obst, $farbe{$obst} ); }
Das Programm erzeugt folgende Ausgabe:
Obst: Farbe: Banane Gelb Zitrone Gelb Orange Orange Apfel Rot
Tie::Hash::Indexed
Tie::Hash::Indexed von Marcus Holland-Moritz erledigt die selbe Aufgabe deutlich schneller, da intern XS zum Einsatz kommt
#!/usr/bin/perl use warnings; use strict; use Tie::Hash::Indexed; my %farbe = (); tie %farbe, "Tie::Hash::Indexed" or die $!; $farbe{'Banane'} = 'Gelb'; $farbe{'Zitrone'} = 'Gelb'; $farbe{'Orange'} = 'Orange'; $farbe{'Apfel'} = 'Rot'; my $pattern = "%-20s %-20s\n"; printf( $pattern, 'Obst:', 'Farbe:' ); # Ausgabe in Einfuege-Reihenfolge foreach my $obst ( keys %farbe ) { printf( $pattern , $obst, $farbe{$obst} ); }
Das Programm erzeugt folgende Ausgabe:
Obst: Farbe: Banane Gelb Zitrone Gelb Orange Orange Apfel Rot
Siehe auch
- Tie::IxHash
- Tie::Hash::Indexed
- perlfaq4 Data: Hashes (Associative Arrays)
- Perl Training Australia: Ordered hashes
- Perl.com: Hash Crash Course
- Perl.com: How Hashes Really Work