Meine Frage hat sich durch das richtige Stichwort "natural sort" erledigt.
wie, hast Du das jetzt erst entdeckt? Tse ;-)
Sei getrost. Irgendwann entdecke ich alle deine Geheimnisse.
Ja natürklich ist das nicht, was Sort::Naturally sortiert. Um es genauer zu sagen, es ist höchst buggy, sobald ein "-" involviert ist.
Deshalb mein eigener Ansatz, hier noch ziemlich straight forward.
my @unsorted = ( 1.1, 'a', '1/1', 11.1, '1,1', 10, 0, '1#1', 11, '1)1', 12, '12-', '11-1', '11-', '1a', '1z', '1-1', '1+1', '1-z', '1 1');
# Schwartian Transform
my @sorted = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { [$_, makekey($_) ] } @unsorted;
sub makekey{
my $ret;
foreach( my @a = ( $_[0] =~ /(\d+|\D+)/g ) ){ # <-- sollte \d{1,5 sein}
/^\d/ and $ret .= sprintf("%05d", $_ );
/^\D/ and $ret .= $_ ;
}
return $ret;
}
print join NL, @sorted;
Ich nutze den Umstand aus, dass Integer die rechts mit 000 gepadded sind, sich in cmp richtig verhalten.
Jetzt kommen Tests und dann Performance Optimierungen.
mfg Beat
--
><o(((°> ><o(((°>
<°)))o>< ><o(((°>o
Der Valigator leibt diese Fische
><o(((°> ><o(((°>
<°)))o>< ><o(((°>o
Der Valigator leibt diese Fische