in reply to Re^5: Sort problems
in thread Sort problems

map { ( my $s = $_ ) =~ s/(\d+)/ sprintf('%010d%s', length($1), 4294967296-$1) /eg; [ $_, $s ] } }

Replies are listed 'Best First'.
Re^7: Sort problems
by erez_ez (Acolyte) on Dec 24, 2008 at 08:55 UTC
    Hi ikegami, Thanks again. I used your code above but it kind of messed up the preliminary sorting. I tried to change it in the regex so it will implement it only on the brackets numbers and changed the sorting order. It succeeded in the brackets numbers but failed again for the "words" sort. This what I did:
    my @new_list = map { $_->[0] } sort { $b->[1] cmp $a->[1] } map { ( my $s = $_ ) =~ s/\[(\d+)/sprintf('%010d%s', l +ength($1),$1)/eg; [ $_, $s ] } @split_list; print "@new_list\n";
    For the testcase I used the list I gave in the main thread. This was the result I got:
    a2_2[10] a2_2[2] a2_2[1] a2_1[10] a2_1[2] a2_1[1] a2_10[10] a2_10[2] a +2_10[1] a1_2[10] a1_2[2] a1_2[1] a1_1[10] a1_1[2] a1_1[1] a1_10[10] a +1_10[2] a1_10[1] a10_2[10] a10_2[2] a10_2[1] a10_1[10] a10_1[2] a10_1 +[1] a10_10[10] a10_10[2] a10_10[1]
    I think I made quite a mess but I couldnt think of another way. Can you advise? Thanks!
      map { my $s = $_; $s =~ s/(?<!\[)(\d+)/ sprintf('%010d%s', length($1), $1) /eg; $s =~ s/(?<=\[)(\d+)/ sprintf('%010d%s', length($1), 4294967296-$1) /eg; [ $_, $s ] } }
        Hi ikegami, Thanks again but it didnt succeed in sorting the numbers inside the brackets. This is the result:
        a1_1[2] a1_1[1] a1_1[10] a1_2[2] a1_2[1] a1_2[10] a1_10[2] a1_10[1] a1 +_10[10] a2_1[2] a2_1[1] a2_1[10] a2_2[2] a2_2[1] a2_2[10] a2_10[2] a2 +_10[1] a2_10[10] a10_1[2] a10_1[1] a10_1[10] a10_2[2] a10_2[1] a10_2[ +10] a10_10[2] a10_10[1] a10_10[10]
        It sorts well the "words" but the order inside the brackets for some reason is 2 1 10. Any suggestion? Thanks.