in reply to Re: Sorting records on a single field
in thread Sorting records on a single field

You can get rid of the reverse operation just inverting the order of the comparison operands. In other words, instead of reverse sort { $a <=> $b } @data use sort { $b <=> $a } @data.

In OP case:

@SortedData = sort { (split (/:/, $b))[-1] <=> (split (/:/, $a))[-1] } + @Data;

Using reverse also makes the sort operation unstable (entries with equal sorting keys do not keep their relative positions after the sort operation).

Replies are listed 'Best First'.
Re^3: Sorting records on a single field
by Lain78 (Initiate) on Jan 21, 2010 at 11:07 UTC

    I see that switching the opereands is better but I don't catch what you mean with "equal sorting keys do not keep their relative positions after the sort operation"... probably I miss something. Could you explain deeply that point? Thanks.

      Sure! Let me do it with an example:
      my @data = qw(1a 1b 2a 2b); my @s1 = reverse sort { $a <=> $b } @data; my @s2 = sort { $b <=> $a } @data; print "@s1\n@s2\n";
      generates:
      2b 2a 1b 1a 2a 2b 1a 1b
      Note how in the second row, elements with the same sorting key (the numeric part) appear in the same order they had in @data while in the first row, corresponding to the reverse solution, they do not.