Wie gebe ich Hashes sortiert aus?

Inhalt:

Teil 1 Alphabetische Sortierung der Schlüssel:

my %liste1 = ("murks"   => "a",
              "grumpf"  => "g",
              "schluck" => "n",
              "hust"    => "l",
              "würg"    => "b",
             );


print join(' :: ', sort { $liste1{$a} cmp $liste1{$b} } keys %liste1), "\n";

Teil 2 Alphabetische Sortierung der Schlüssel und der Werte:

my %liste1     = ("murks"   => "a",
                  "grumpf"  => "g",
                  "schluck" => "n",
                  "hust"    => "l",
                  "würg"    => "b",
                 );


#
# Schlüssel sortiert nach den Werten ausgeben:
#
print join(' :: ', (sort {$liste1{$a} cmp $liste1{$b}} keys %liste1)), "\n";

#
# Werte sortiert nach den Werten ausgeben:
#
print join(' :: ', (map $liste1{$_}, sort {$liste1{$a} cmp $liste1{$b}} keys %liste1)), "\n";

Teil 3 Sortierung der Schlüssel nach den Werten auf bestimmte Weise:

Das folgende Programm gibt die Schlüssel sortiert nach den Werten aus, wobei die Werte auf folgende Weise sortiert werden:

Zahlen vor Alphanumerischen einträgen Zahlen unter sich numerisch soriert (3 ist kleiner als 17) Alphanumerische Strings unter sich alphanumerisch sortiert

my %liste1 = ("murks"     => "a",
              "grumpf"    => "g",
              "schluck"   => "n",
              "hust"      => "l",
              "würg"      => "b",
              "schnüffel" => "C",
              "mecker"    => "3",
              "argl"      => "17",
             );

sub vergl {
    my $aa = $liste1{$a};
    my $bb = $liste1{$b};
    my $a_is_number = $aa !~ /\D/;
    my $b_is_number = $bb !~ /\D/;

    #print "a='$a' b='$b', a_is_number='$a_is_number' b_is_number='$b_is_number'\n";

    return -1 if $a_is_number and not $b_is_number;
    return 1  if $b_is_number and not $a_is_number;
    return $aa <=> $bb if $a_is_number and $b_is_number;
    return lc($aa) cmp lc($bb);
}

print join(' :: ', sort vergl keys %liste1), "\n";

Teil 4 Sortierung einer Datei nach verschiedenen Spalten:

my @array = <DATA>;
map chomp, @array;
map $_=[ split(/\|/, $_) ], @array;


print join(' - ', @{$_}), "\n" for sort {$$a[0]cmp$$b[0] || $$a[2]cmp$$b[2]} @array;

#
# Hier wird die hinter __DATA__ angegebene Datei zunächst in ein
# Array eingelesen (nach dem Pipesymbol gesplittet), dann
# sortiert das Programm das Array nach der 1. und 3. Spalte.
#

__DATA__
a|egal|c|egal|egal
b|egal|b|egal|egal
c|egal|h|egal|egal
b|egal|a|egal|egal
c|egal|f|egal|egal
b|egal|c|egal|egal
c|egal|i|egal|egal

Ergänzungen, Kommentare

Kommentare werden am besten in folgender Form vorgenommen, damit sie im Inhaltsverzeichnis angezeigt werden (natürlich ohne das <verbatim>):
-- Main.ChristianDuehl - 22 Aug 2003 - Seite erzeugt

TinaMueller - 26 Aug 2003 - Werte sortiert nach Werten ausgeben

Das geht auch einfacher mit der Funktion values() :
print join(' :: ', sort values %liste1 ), "\n";

UtilFaqSubForm edit

Titel Hashes: Wie gebe ich Hashes sortiert aus?
Autor
Bereich FaqTypen
Topic revision: 2006-04-10, TinaMueller
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.