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

Weitere Posts