你好 Karle,
<key>: value1 value2 ...
a: name1 neuername1/12
b: name1 neuername2/23
c: name1 neuername1/1
d: name10 neuername1/1
e: name2 neuername1/3
>
> So und nun hätte ich das gerne so sortiert bzw. meinen print:
>
> ~~~perl
name1 neuername1/1 ...
> name1 neuername1/12 ...
> name1 neuername2/23 ...
> name2 neuername1/3 ...
> name10 neuername1/1 ...
Also die Sortierreihenfolge ist - erst value1 alphabetisch(und wenn möglich die Zahl numerisch) und dann value2 ebenfalls so. Der Key ist mir egal.
Da sort einen Block als Sortier-Kriterium erlaubt, kannst du das doch mit beliebig komplexem Code umsetzen. Ein Ansatz wäre:
use strict;
use Data::Dumper;
sub get_parts;
my $data = {
a => ['name1', 'neuername1/12'],
b => ['name1', 'neuername2/23'],
c => ['name1', 'neuername1/1'],
d => ['name10', 'neuername1/1'],
e => ['name2', 'neuername1/3']
};
my @sorted_keys = sort {
my ($charpart_a,$digitpart_a) = get_parts($data->{$a}->[0]);
my ($charpart_b,$digitpart_b) = get_parts($data->{$b}->[0]);
if($charpart_a eq $charpart_b) {
if($digitpart_a == $digitpart_b) {
my ($charpart_a,$digitpart_a,$digitpart2_a) = get_parts($data->{$a}->[1]);
my ($charpart_b,$digitpart_b,$digitpart2_b) = get_parts($data->{$b}->[1]);
if($charpart_a eq $charpart_b) {
if($digitpart_a == $digitpart_b) {
$digitpart2_a <=> $digitpart2_b;
}
else {
$digitpart_a <=> $digitpart_b;
}
}
else {
$charpart_a cmp $charpart_b;
}
}
else {
$digitpart_a <=> $digitpart_b;
}
}
else {
$charpart_a cmp $charpart_b;
}
} keys %$data;
print join(", ",@sorted_keys),"\n";
sub get_parts {
$_[0] =~ /^(\w+)(\d+)(?:\/(\d+))?$/;
return ($1,int($2),$3);
}
# eof
再见,
克里斯蒂安
--
http://wwwtech.de/
IRC-Clients und Irssi-Scripting | Flyspray
<Tim> Ich bin nicht hier, um zu helfen. Mir hilft ja auch keiner. Sogar mein Brötchen muss ich mir jetzt selber schmieren.
http://wwwtech.de/
IRC-Clients und Irssi-Scripting | Flyspray
<Tim> Ich bin nicht hier, um zu helfen. Mir hilft ja auch keiner. Sogar mein Brötchen muss ich mir jetzt selber schmieren.