Beat: perverted sort ;)

Beitrag lesen

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