http://qs1969.pair.com?node_id=517201


in reply to Re: Sorting an array on two computed fields
in thread Sorting an array on two computed fields

sorry for changing the requirement again what will happen if the array contains as follows:-
my @array = ( '1-1', '6', '2-5', '1-10', '7', '1-3','2-1');
"Keep pouring your ideas"

Replies are listed 'Best First'.
Re^3: Sorting an array on two computed fields
by davido (Cardinal) on Dec 16, 2005 at 10:41 UTC

    ...expanding on my version "without Schwartzian Transform":

    my @sorted = sort { my @a = split /-/, $a; my @b = split /-/, $b; $a[0] <=> $b[0] or ( defined( $a[1] ) && defined( $b[1] ) and $a[1] <=> $b[1] ) } @unsorted;

    As before, the worst part is figuring out how to tab the whole thing to keep it readable. ;) You need the defined test so that fall-through doesn't occur on single-term items.

    Update: Hmm, there is a problem here though. You didn't define whether "6" should come before, after, or between "6-0" and "6-10". My solution didn't define it either, which means that the definition of the problem is inadequate, and that the solution is equally inadequate. But the point to all this is that you can hand-craft your sort routine. ...just think through what you want it to do, and craft your code. I need to get some sleep, so I'll leave you in the capable hands of the rest of the PerlMonks. :) You can do it, really. Dig in and let us know when you get stuck.


    Dave

Re^3: Sorting an array on two computed fields
by blazar (Canon) on Dec 16, 2005 at 10:57 UTC
    sorry for changing the requirement again what will happen if the array contains as follows:
    my @array = ( '1-1', '6', '2-5', '1-10', '7', '1-3','2-1');
    Well, then it depends on how you want '6' to compare to the other entries. If it's the ehm natural one, then again Sort::Naturally should be appropriate!