This node falls below the community's threshold of quality. You may see it by logging in.

Replies are listed 'Best First'.
Re: Sorting @_
by merlyn (Sage) on Nov 19, 2000 at 07:57 UTC
    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

      Thank you :-)

      Yes, I misstyped the {}

      I try to get rid off my usual way to sort an argument to a sub, which is

      my @Data = @_; my @Sorted = sort {$a cmp $b} @Data;
Re: Sorting @_
by damian1301 (Curate) on Nov 19, 2000 at 08:08 UTC
    yep, it should just be
    @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;
      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"...