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

For some reason, I thought the leading zero would address that. What was I thinking? Moving on...

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

One could use pack instead of sprintf, but it won't work with unicode semantics. That's already a problem, but it'll be even worse in 5.12 because I believe unicode semantics will be used for all strings instead of just those internally encoded as UTF-8 (by default).

Replies are listed 'Best First'.
Re^5: Sort problems
by erez_ez (Acolyte) on Dec 23, 2008 at 13:39 UTC
    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]
      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!