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";