Ordered Hashes mit Tie::IxHash oder Tie::Hash::Indexed

| | Kommentare (0)

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

Jetzt kommentieren

Über diese Seite

Diese Seite enthält einen einen einzelnen Eintrag von Thomas Fahle vom 17.11.09 20:15.

Frankfurter Perl-Community Workshop 2009 am 28. und 29.11.2009 ist der vorherige Eintrag in diesem Blog.

12. Deutscher Perl-Workshop in Schorndorf vom 07.-09. Juni 2010 in der Barbara-Künkelin-Halle ist der nächste Eintrag in diesem Blog.

Aktuelle Einträge finden Sie auf der Startseite, alle Einträge in den Archiven.

Blog Roll

Powered by

Powered by Movable Type 5.2.10

Creative Commons-Lizenz

Creative Commons License
Dieses Weblog steht unter einer Creative Commons-Lizenz.