in reply to Re: Sorting @_
in thread Sorting @_

The attempt to do both on one line just sorts in alphabetical order - it never (usefully) gets to the numerical sort.

You could try reversing the numerical and string comparisons, this will have roughly the right effect, but try it with warnings on and you may not be so amused.

If you are interested, I have an old comparison function that has a significant performance hit, but generally gets the sort order to be what most people expect:

sub smartcomp { my @first = ($a =~ /(\D*)(\d*)/g); my @second = ($b =~ /(\D*)(\d*)/g); while (@first and @second) { my $one = uc shift @first; my $two = uc shift @second; my $cmp = $one cmp $two; return $cmp if $cmp; # Case-insensitive comp on string $one = shift @first; $two = shift @second; $cmp = $one <=> $two; return $cmp if $cmp; # Numerical sort on digits } # Check to see which ran out first. if (@first) { return -1; } elsif (@second) { return 1; } else { # And finally a case-sensitive comparison return ($a cmp $b); } }
This is meant for people who prefer to see "strict.pm" before "Term" and "FAQ_2" before "FAQ_10"...