This not only is invalid syntax (I think you meant {} instead of () there),
it's also far more expensive than just saying sort! What are you really
trying to accomplish, or did I miss something entirely?
-- Randal L. Schwartz, Perl hacker | [reply] |
my @Data = @_;
my @Sorted = sort {$a cmp $b} @Data;
| [reply] [d/l] |
@sorted = sort {$a cmp $b} @data;
when
@sorted = sort @data;
will do, and faster!
-- Randal L. Schwartz, Perl hacker | [reply] [d/l] [select] |
@blah = sort {$a cmp $b} @_;
Or you can sort numbers..
@blah = sort {$a <=> $b} @_;
Or do both in one line...
@blah = sort {$a cmp $b || $a <=> $b} @foo;
| [reply] [d/l] [select] |
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"... | [reply] [d/l] |