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

It worked great! Thanks! One more thing, what if I want to sort the numbers inside the brackets from top to bottom? I mean, the same sort you did for the word but opposite sort to the numbers in the brackets:
a[2] a[1] b[1] b[0]

Replies are listed 'Best First'.
Re^6: Sort problems
by ikegami (Patriarch) on Dec 23, 2008 at 18:03 UTC
    map { ( my $s = $_ ) =~ s/(\d+)/ sprintf('%010d%s', length($1), 4294967296-$1) /eg; [ $_, $s ] } }
      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 ] } }