in reply to Sorting strings

Since I haven't done a version of my standard "natural sort" trick that handles negative numbers recently, here goes:

my @deltas= qw( -6h0m +11h39m 0h2m +1h7m -12h8m ); @deltas= @deltas[ do { s#([-+]?\d+)# "\x80" ^ pack"N",$1 #ge for my @sort= @deltas; sort { $sort[$a] cmp $sort[$b] } 0..$#sort; } ]; print "@deltas\n";

        - tye (but my friends call me "Tye")

Replies are listed 'Best First'.
Re: (tye)Re: Sorting strings ("natural sort" w/ negatives)
by Hofmator (Curate) on Aug 31, 2001 at 21:33 UTC

    mmhhh, breaks on this my @deltas= qw( -1h0m -1h10m -0h50m );

    -- Hofmator

      Yes. Sorry, I should have realized that a "natural sort" doesn't handle that (the negative sign distributes across to the minutes field but the "natural sort" is not aware of this).

      Though you can still use a natural sort, you just have to process the leading sign separately. For example:

      my @deltas= qw( -6h0m -0h42m +0h18m -12h50m +11h39m 0h2m +1h7m -12h8m -0h25m 0h0m ); @deltas= do { my( @sort, %sort )= map { local($_)= $_; my $sign= s#^([-+]?)## && $1; s#(\d+)# "\x80" ^ pack"N",$sign.$1 #ge; $_; } @deltas; @sort{@sort}= @deltas; @sort{ sort @sort }; }; print "@deltas\n";

      Though just for fun I switched from an index sort to a key sort so this version drops identical values. (:

              - tye (but my friends call me "Tye")