perlmeditation
rsFalse
<small><i><b>Upd.</b> I slightly changed a node name and rewrote a section about <b>reverse</b> (older text is under strikethrough and moved to the end of the post).</i></small>
<br>
<br>
Rarely we want to do something the same with both: with original and reversed list, or with original and sorted (and sorted backwards) list. Here you will find few examples how to use a simple switch to turn ON/OFF sorting or reversing list.<br><br>
<b>sort</b>: Say we want to apply some function on original, sorted, and sorted backwards list. Example program:<br>
<readmore>
<code>
#!/usr/bin/perl
use warnings;
use strict;
$\ = $/;
sub sort_sub{
return $a cmp $b;
}
sub some_sub{
my $ref = shift;
print "@{ $ref }";
for my $i ( 0 .. @{ $ref } - 2 ){
$ref->[ $i ] cmp $ref->[ $i + 1 ] and do { ;;; };
}
}
</code>
</readmore>
<code>
my @original = ( 5, 'A' .. 'C', 0, 4 );
my @sorted = sort sort_sub @original;
my @r_sorted = reverse @sorted;
some_sub( $_ ) for \@original, \@sorted, \@r_sorted;
print '-';
</code>
Now we use multiplicative "switch" to gain the same output:
<code>
some_sub( [ sort { $_ * sort_sub } @original ] ) for 0, 1, -1;
print '-';
</code>
<small>Note we avoided intermediate variables.</small><br>
<readmore>
OUTPUT:
<code>
5 A B C 0 4
0 4 5 A B C
C B A 5 4 0
-
5 A B C 0 4
0 4 5 A B C
C B A 5 4 0
-
</code>
Explanation. Sort subroutine returns -1, 0 or 1 on each comparison of $a and $b. In case we multiply by -1, we invert the result; in case with 1 we don't change anything; in case with 0 we convert all comparison to "equals", so sorting algorithm are not to change ordering of list elements.<br><br>
</readmore>
<b>reverse</b>: Say we want to apply some function on original and reversed list. We can simply pass 0 or 1 into <code>sort</code> block:<br>
<code>
my @reversed = reverse @original;
some_sub( $_ ) for \@original, \@reversed;
print '-';
some_sub( [ sort { $_ } @original ] ) for 0, 1;
</code>
<readmore>
OUTPUT:
<code>
5 A B C 0 4
4 0 C B A 5
-
5 A B C 0 4
4 0 C B A 5
</code>
Explanation. No matter how each of two elements are compared, we assign a 1 or 0 to a comparison result. If 0, then algorithm is to do nothing. If 1, then algorithm reverse a pair of elements. It seems to works fine with Perl's mergesort (which is by default since v5.8.0)*. <strike>If -1, then our list becomes kinda shuffled with some pattern.</strike>**<br><br>
*<small><i>Upd.</i>
Although documentation of sort pragma (e.g. [doc://5.26.3/sort]) was not clear about which sort algorithm is default saying "...but in Perl 5.8 a mergesort algorithm was also made available..." while talking mostly about quicksort, but meanwhile perlsec (e.g. [doc://5.26.3/perlsec]) says strictly: "Starting from Perl 5.8.0 a different sorting algorithm, mergesort, is used by default."</small>
<br>
<br>
<i>Upd.</i> Have in mind that reversing a huge list with <code>'sort {1} list'</code> <strike>may take a bit more time</strike>*** instead of simply reversing with <i>O(N)</i> time.
<br>
<br>
<i>Upd.</i>** It seems that <code>'sort {-1} list'</code> shuffles list elements to some pattern <b>IF</b> the length of the list is between 3 and 17! <b>Otherwise</b> it doesn't shuffle, i.e. outputs the same as <code>'sort {0} list'</code> does.
<br>
<br>
<i>Upd.</i>*** <code>'sort { $_ } list'</code> where <code>$_</code> is 1, 0 or -1 behaves linearly in O(N).
<br>
<br>
Here is the code which I used for finding how many iterations sort uses and does <code>'sort {-1} list'</code> shuffle elements or not:
<code>
srand 1;
my $show_distance = 10;
for my $length ( 1 .. 3 ** 3 - 1,
map { 3 ** $_, 3 ** $_ + 1 } 3 .. 10,
){
print join " length: $length ", ( '=' x 5 ) x 2;
my $test = [ map int rand 10, 1 .. $length ];
my %sub = (
'$a <=> $b' => { 'sub' => sub { $a <=> $b } },
'0' => { 'sub' => sub { 0 } },
'1' => { 'sub' => sub { 1 } },
'-1' => { 'sub' => sub { -1 } },
);
for my $key ( sort keys %sub ){
my $count = 0;
$sub{ $key }{ 'array' } =
[ sort { $count ++; $sub{ $key }{ 'sub' }->() } @{ $test } ];
$sub{ $key }{ 'count' } = $count;
}
for my $key ( sort keys %sub ){
print "\$key:[$key]";
print " count:[$sub{ $key }{ 'count' }]";
my $len = @{ $sub{ $key }{ 'array' } };
printf " array:[%s ... %s]\n",
( join ' ', @{ $sub{ $key }{ 'array' } }[
grep { 0
|| $show_distance > abs( $_ - 0 )
} 0 .. $len - 1
] ),
( join ' ', @{ $sub{ $key }{ 'array' } }[
grep { 0
|| $show_distance > abs( $_ - $len + 1 )
&& not $show_distance > abs( $_ - 0 )
} 0 .. $len - 1
] ),
;
}
print "key='1' NOT EQUAL to reverse!" if "@{ $sub{ 1 }{ 'array' } }"
ne join ' ', reverse @{ $test };
print "key='-1' NOT EQUAL to key='0'!" if "@{ $sub{ -1 }{ 'array' } }"
ne "@{ $sub{ 0 }{ 'array' } }";
print '';
}
</code>
OUTPUT:
<code>
===== length: 1 =====
$key:[$a <=> $b]
count:[0]
array:[0 ... ]
$key:[-1]
count:[0]
array:[0 ... ]
$key:[0]
count:[0]
array:[0 ... ]
$key:[1]
count:[0]
array:[0 ... ]
===== length: 2 =====
$key:[$a <=> $b]
count:[1]
array:[4 8 ... ]
$key:[-1]
count:[1]
array:[4 8 ... ]
$key:[0]
count:[1]
array:[4 8 ... ]
$key:[1]
count:[1]
array:[8 4 ... ]
===== length: 3 =====
$key:[$a <=> $b]
count:[2]
array:[0 3 5 ... ]
$key:[-1]
count:[3]
array:[3 0 5 ... ]
$key:[0]
count:[3]
array:[3 5 0 ... ]
$key:[1]
count:[2]
array:[0 5 3 ... ]
key='-1' NOT EQUAL to key='0'!
===== length: 4 =====
$key:[$a <=> $b]
count:[5]
array:[1 3 7 9 ... ]
$key:[-1]
count:[5]
array:[1 7 9 3 ... ]
$key:[0]
count:[4]
array:[1 9 7 3 ... ]
$key:[1]
count:[4]
array:[3 7 9 1 ... ]
key='-1' NOT EQUAL to key='0'!
===== length: 5 =====
$key:[$a <=> $b]
count:[8]
array:[0 1 3 5 9 ... ]
$key:[-1]
count:[7]
array:[3 9 1 5 0 ... ]
$key:[0]
count:[8]
array:[3 5 1 0 9 ... ]
$key:[1]
count:[5]
array:[9 0 1 5 3 ... ]
key='-1' NOT EQUAL to key='0'!
===== length: 6 =====
$key:[$a <=> $b]
count:[11]
array:[1 1 2 5 6 8 ... ]
$key:[-1]
count:[10]
array:[1 1 2 6 5 8 ... ]
$key:[0]
count:[9]
array:[1 5 2 8 1 6 ... ]
$key:[1]
count:[7]
array:[6 1 8 2 5 1 ... ]
key='-1' NOT EQUAL to key='0'!
===== length: 7 =====
$key:[$a <=> $b]
count:[13]
array:[0 2 3 5 5 8 9 ... ]
$key:[-1]
count:[14]
array:[2 3 5 5 0 8 9 ... ]
$key:[0]
count:[11]
array:[2 0 5 9 3 8 5 ... ]
$key:[1]
count:[9]
array:[5 8 3 9 5 0 2 ... ]
key='-1' NOT EQUAL to key='0'!
===== length: 8 =====
$key:[$a <=> $b]
count:[16]
array:[0 1 2 3 6 8 8 9 ... ]
$key:[-1]
count:[17]
array:[3 9 6 1 8 0 2 8 ... ]
$key:[0]
count:[12]
array:[3 8 6 2 9 0 1 8 ... ]
$key:[1]
count:[12]
array:[8 1 0 9 2 6 8 3 ... ]
key='-1' NOT EQUAL to key='0'!
===== length: 9 =====
$key:[$a <=> $b]
count:[21]
array:[1 2 3 4 4 5 6 6 7 ... ]
$key:[-1]
count:[19]
array:[1 3 4 6 2 4 5 7 6 ... ]
$key:[0]
count:[18]
array:[1 7 2 6 4 5 3 4 6 ... ]
$key:[1]
count:[12]
array:[6 4 3 5 4 6 2 7 1 ... ]
key='-1' NOT EQUAL to key='0'!
===== length: 10 =====
$key:[$a <=> $b]
count:[25]
array:[1 3 3 6 6 7 7 8 8 9 ... ]
$key:[-1]
count:[23]
array:[7 1 9 6 8 8 6 3 7 3 ... ]
$key:[0]
count:[19]
array:[7 7 8 3 9 6 1 8 6 3 ... ]
$key:[1]
count:[15]
array:[3 6 8 1 6 9 3 8 7 7 ... ]
key='-1' NOT EQUAL to key='0'!
===== length: 11 =====
$key:[$a <=> $b]
count:[27]
array:[0 2 2 2 4 5 5 5 5 6 ... 9]
$key:[-1]
count:[27]
array:[5 6 2 0 2 5 5 5 4 2 ... 9]
$key:[0]
count:[23]
array:[5 4 2 9 2 5 6 5 5 2 ... 0]
$key:[1]
count:[17]
array:[0 2 5 5 6 5 2 9 2 4 ... 5]
key='-1' NOT EQUAL to key='0'!
===== length: 12 =====
$key:[$a <=> $b]
count:[30]
array:[1 2 3 5 5 5 6 6 6 7 ... 7 9]
$key:[-1]
count:[31]
array:[2 5 6 1 7 6 3 5 7 5 ... 6 9]
$key:[0]
count:[24]
array:[2 7 7 6 6 3 5 5 6 9 ... 1 5]
$key:[1]
count:[20]
array:[5 1 9 6 5 5 3 6 6 7 ... 7 2]
key='-1' NOT EQUAL to key='0'!
===== length: 13 =====
$key:[$a <=> $b]
count:[34]
array:[0 2 2 2 3 3 5 5 6 8 ... 9 9 9]
$key:[-1]
count:[34]
array:[0 9 2 2 2 9 3 6 5 3 ... 8 9 5]
$key:[0]
count:[28]
array:[0 5 2 9 2 8 3 5 9 6 ... 9 3 2]
$key:[1]
count:[22]
array:[2 3 9 6 9 5 3 8 2 9 ... 2 5 0]
key='-1' NOT EQUAL to key='0'!
===== length: 14 =====
$key:[$a <=> $b]
count:[39]
array:[1 3 3 3 4 5 5 5 6 8 ... 9 9 9 9]
$key:[-1]
count:[39]
array:[4 3 3 6 3 5 5 5 9 1 ... 9 9 8 9]
$key:[0]
count:[29]
array:[4 9 3 8 3 9 5 9 3 1 ... 5 9 6 5]
$key:[1]
count:[25]
array:[5 6 9 5 1 3 9 5 9 3 ... 8 3 9 4]
key='-1' NOT EQUAL to key='0'!
===== length: 15 =====
$key:[$a <=> $b]
count:[42]
array:[0 0 1 1 2 3 6 6 6 8 ... 8 8 9 9 9]
$key:[-1]
count:[45]
array:[9 2 8 6 9 9 0 8 3 1 ... 6 0 6 8 1]
$key:[0]
count:[31]
array:[9 3 9 6 8 6 0 1 2 1 ... 9 8 6 0 8]
$key:[1]
count:[28]
array:[8 0 6 8 9 1 2 1 0 6 ... 8 6 9 3 9]
key='-1' NOT EQUAL to key='0'!
===== length: 16 =====
$key:[$a <=> $b]
count:[47]
array:[1 2 2 2 3 4 4 5 5 7 ... 7 7 8 9 9 9]
$key:[-1]
count:[49]
array:[2 8 1 5 3 2 9 9 7 4 ... 2 5 9 4 7 7]
$key:[0]
count:[32]
array:[2 7 3 9 1 2 9 7 8 4 ... 2 4 5 5 9 7]
$key:[1]
count:[32]
array:[7 9 5 5 4 2 4 8 7 9 ... 2 1 9 3 7 2]
key='-1' NOT EQUAL to key='0'!
===== length: 17 =====
$key:[$a <=> $b]
count:[54]
array:[0 1 2 2 2 2 4 4 4 4 ... 4 5 6 6 7 7 8]
$key:[-1]
count:[51]
array:[7 2 5 7 4 4 4 6 2 4 ... 8 2 1 2 6 0 4]
$key:[0]
count:[39]
array:[7 0 2 4 4 1 5 8 4 6 ... 2 4 4 2 7 2 6]
$key:[1]
count:[31]
array:[6 2 7 2 4 4 2 6 4 8 ... 5 1 4 4 2 0 7]
key='-1' NOT EQUAL to key='0'!
===== length: 18 =====
$key:[$a <=> $b]
count:[57]
array:[0 1 1 2 2 2 3 3 3 3 ... 5 5 6 6 6 6 7 9]
$key:[-1]
count:[17]
array:[6 3 0 2 3 9 5 2 6 1 ... 1 6 5 6 2 3 7 3]
$key:[0]
count:[17]
array:[6 3 0 2 3 9 5 2 6 1 ... 1 6 5 6 2 3 7 3]
$key:[1]
count:[17]
array:[3 7 3 2 6 5 6 1 1 6 ... 2 5 9 3 2 0 3 6]
===== length: 19 =====
$key:[$a <=> $b]
count:[60]
array:[0 0 2 2 3 3 3 4 4 5 ... 5 7 7 7 7 8 8 9 9]
$key:[-1]
count:[18]
array:[8 4 7 2 7 3 7 3 0 5 ... 9 0 2 9 8 4 7 3 5]
$key:[0]
count:[18]
array:[8 4 7 2 7 3 7 3 0 5 ... 9 0 2 9 8 4 7 3 5]
$key:[1]
count:[18]
array:[5 3 7 4 8 9 2 0 9 5 ... 0 3 7 3 7 2 7 4 8]
===== length: 20 =====
$key:[$a <=> $b]
count:[66]
array:[0 1 1 2 2 2 3 3 3 4 ... 4 5 5 5 6 7 7 7 7 9]
$key:[-1]
count:[19]
array:[5 2 5 4 9 2 7 3 2 3 ... 7 6 5 7 1 4 0 3 1 7]
$key:[0]
count:[19]
array:[5 2 5 4 9 2 7 3 2 3 ... 7 6 5 7 1 4 0 3 1 7]
$key:[1]
count:[19]
array:[7 1 3 0 4 1 7 5 6 7 ... 3 2 3 7 2 9 4 5 2 5]
===== length: 21 =====
$key:[$a <=> $b]
count:[68]
array:[0 0 0 2 3 4 4 5 5 5 ... 5 6 6 7 8 8 9 9 9 9]
$key:[-1]
count:[20]
array:[9 5 9 4 8 5 5 9 4 7 ... 3 9 8 2 6 0 5 0 5 0]
$key:[0]
count:[20]
array:[9 5 9 4 8 5 5 9 4 7 ... 3 9 8 2 6 0 5 0 5 0]
$key:[1]
count:[20]
array:[0 5 0 5 0 6 2 8 9 3 ... 7 4 9 5 5 8 4 9 5 9]
===== length: 22 =====
$key:[$a <=> $b]
count:[71]
array:[0 0 0 0 1 2 2 3 3 3 ... 4 4 5 6 6 8 8 8 8 9]
$key:[-1]
count:[21]
array:[8 0 8 4 4 5 0 6 6 3 ... 0 8 0 9 1 8 2 3 3 4]
$key:[0]
count:[21]
array:[8 0 8 4 4 5 0 6 6 3 ... 0 8 0 9 1 8 2 3 3 4]
$key:[1]
count:[21]
array:[4 3 3 2 8 1 9 0 8 0 ... 3 6 6 0 5 4 4 8 0 8]
===== length: 23 =====
$key:[$a <=> $b]
count:[79]
array:[0 0 1 1 3 3 4 5 5 5 ... 7 8 8 8 8 9 9 9 9 9]
$key:[-1]
count:[22]
array:[5 5 1 9 9 3 5 8 9 8 ... 9 6 7 9 3 4 5 1 8 0]
$key:[0]
count:[22]
array:[5 5 1 9 9 3 5 8 9 8 ... 9 6 7 9 3 4 5 1 8 0]
$key:[1]
count:[22]
array:[0 8 1 5 4 3 9 7 6 9 ... 8 9 8 5 3 9 9 1 5 5]
===== length: 24 =====
$key:[$a <=> $b]
count:[81]
array:[0 0 0 0 0 1 2 2 3 3 ... 5 6 6 6 7 7 7 7 8 9]
$key:[-1]
count:[23]
array:[0 6 5 3 6 7 4 0 4 7 ... 0 6 2 9 0 4 4 8 7 7]
$key:[0]
count:[23]
array:[0 6 5 3 6 7 4 0 4 7 ... 0 6 2 9 0 4 4 8 7 7]
$key:[1]
count:[23]
array:[7 7 8 4 4 0 9 2 6 0 ... 7 4 0 4 7 6 3 5 6 0]
===== length: 25 =====
$key:[$a <=> $b]
count:[95]
array:[0 1 1 1 2 2 2 2 2 2 ... 5 5 5 5 6 6 6 8 8 8]
$key:[-1]
count:[24]
array:[8 2 4 1 4 2 3 2 5 1 ... 5 2 1 2 6 4 3 2 6 8]
$key:[0]
count:[24]
array:[8 2 4 1 4 2 3 2 5 1 ... 5 2 1 2 6 4 3 2 6 8]
$key:[1]
count:[24]
array:[8 6 2 3 4 6 2 1 2 5 ... 1 5 2 3 2 4 1 4 2 8]
===== length: 26 =====
$key:[$a <=> $b]
count:[90]
array:[0 1 1 1 2 2 2 3 3 4 ... 6 6 6 7 7 7 8 8 8 9]
$key:[-1]
count:[25]
array:[0 2 8 7 6 6 6 2 1 7 ... 4 5 4 3 7 9 1 2 6 8]
$key:[0]
count:[25]
array:[0 2 8 7 6 6 6 2 1 7 ... 4 5 4 3 7 9 1 2 6 8]
$key:[1]
count:[25]
array:[8 6 2 1 9 7 3 4 5 4 ... 7 1 2 6 6 6 7 8 2 0]
===== length: 27 =====
$key:[$a <=> $b]
count:[99]
array:[0 0 0 0 0 1 1 2 3 3 ... 7 7 7 7 8 8 8 9 9 9]
$key:[-1]
count:[26]
array:[0 3 0 7 4 7 1 9 7 3 ... 6 8 7 0 0 0 3 6 1 6]
$key:[0]
count:[26]
array:[0 3 0 7 4 7 1 9 7 3 ... 6 8 7 0 0 0 3 6 1 6]
$key:[1]
count:[26]
array:[6 1 6 3 0 0 0 7 8 6 ... 3 7 9 1 7 4 7 0 3 0]
===== length: 28 =====
$key:[$a <=> $b]
count:[101]
array:[0 0 0 1 1 1 1 1 2 2 ... 6 6 6 7 7 8 8 9 9 9]
$key:[-1]
count:[27]
array:[1 1 3 1 6 0 8 4 8 2 ... 9 6 3 3 5 9 7 7 5 6]
$key:[0]
count:[27]
array:[1 1 3 1 6 0 8 4 8 2 ... 9 6 3 3 5 9 7 7 5 6]
$key:[1]
count:[27]
array:[6 5 7 7 9 5 3 3 6 9 ... 2 8 4 8 0 6 1 3 1 1]
===== length: 81 =====
$key:[$a <=> $b]
count:[415]
array:[0 0 0 0 0 0 0 0 0 1 ... 8 8 9 9 9 9 9 9 9 9]
$key:[-1]
count:[80]
array:[8 3 5 8 0 6 1 0 0 4 ... 0 9 1 9 6 3 1 4 9 4]
$key:[0]
count:[80]
array:[8 3 5 8 0 6 1 0 0 4 ... 0 9 1 9 6 3 1 4 9 4]
$key:[1]
count:[80]
array:[4 9 4 1 3 6 9 1 9 0 ... 4 0 0 1 6 0 8 5 3 8]
===== length: 82 =====
$key:[$a <=> $b]
count:[421]
array:[0 0 0 0 0 0 0 0 0 1 ... 8 8 8 8 9 9 9 9 9 9]
$key:[-1]
count:[81]
array:[1 5 8 6 0 2 8 7 6 1 ... 1 9 1 5 9 7 0 4 9 2]
$key:[0]
count:[81]
array:[1 5 8 6 0 2 8 7 6 1 ... 1 9 1 5 9 7 0 4 9 2]
$key:[1]
count:[81]
array:[2 9 4 0 7 9 5 1 9 1 ... 1 6 7 8 2 0 6 8 5 1]
===== length: 243 =====
$key:[$a <=> $b]
count:[1572]
array:[0 0 0 0 0 0 0 0 0 0 ... 9 9 9 9 9 9 9 9 9 9]
$key:[-1]
count:[242]
array:[2 4 4 6 3 0 5 3 2 2 ... 1 2 5 5 8 9 4 6 7 7]
$key:[0]
count:[242]
array:[2 4 4 6 3 0 5 3 2 2 ... 1 2 5 5 8 9 4 6 7 7]
$key:[1]
count:[242]
array:[7 7 6 4 9 8 5 5 2 1 ... 2 2 3 5 0 3 6 4 4 2]
===== length: 244 =====
$key:[$a <=> $b]
count:[1590]
array:[0 0 0 0 0 0 0 0 0 0 ... 9 9 9 9 9 9 9 9 9 9]
$key:[-1]
count:[243]
array:[8 5 7 8 8 6 7 9 1 4 ... 6 7 4 8 2 4 5 0 5 3]
$key:[0]
count:[243]
array:[8 5 7 8 8 6 7 9 1 4 ... 6 7 4 8 2 4 5 0 5 3]
$key:[1]
count:[243]
array:[3 5 0 5 4 2 8 4 7 6 ... 4 1 9 7 6 8 8 7 5 8]
===== length: 729 =====
$key:[$a <=> $b]
count:[5321]
array:[0 0 0 0 0 0 0 0 0 0 ... 9 9 9 9 9 9 9 9 9 9]
$key:[-1]
count:[728]
array:[4 2 9 5 7 4 2 1 3 6 ... 2 9 6 0 4 9 4 3 0 3]
$key:[0]
count:[728]
array:[4 2 9 5 7 4 2 1 3 6 ... 2 9 6 0 4 9 4 3 0 3]
$key:[1]
count:[728]
array:[3 0 3 4 9 4 0 6 9 2 ... 6 3 1 2 4 7 5 9 2 4]
===== length: 730 =====
$key:[$a <=> $b]
count:[5384]
array:[0 0 0 0 0 0 0 0 0 0 ... 9 9 9 9 9 9 9 9 9 9]
$key:[-1]
count:[729]
array:[1 2 5 2 9 6 6 0 4 9 ... 4 7 1 8 2 6 5 9 5 9]
$key:[0]
count:[729]
array:[1 2 5 2 9 6 6 0 4 9 ... 4 7 1 8 2 6 5 9 5 9]
$key:[1]
count:[729]
array:[9 5 9 5 6 2 8 1 7 4 ... 9 4 0 6 6 9 2 5 2 1]
===== length: 2187 =====
$key:[$a <=> $b]
count:[16600]
array:[0 0 0 0 0 0 0 0 0 0 ... 9 9 9 9 9 9 9 9 9 9]
$key:[-1]
count:[2186]
array:[0 0 9 3 2 1 0 7 9 7 ... 0 2 4 8 7 2 2 5 3 6]
$key:[0]
count:[2186]
array:[0 0 9 3 2 1 0 7 9 7 ... 0 2 4 8 7 2 2 5 3 6]
$key:[1]
count:[2186]
array:[6 3 5 2 2 7 8 4 2 0 ... 7 9 7 0 1 2 3 9 0 0]
===== length: 2188 =====
$key:[$a <=> $b]
count:[16606]
array:[0 0 0 0 0 0 0 0 0 0 ... 9 9 9 9 9 9 9 9 9 9]
$key:[-1]
count:[2187]
array:[7 0 8 6 8 3 0 9 0 4 ... 7 5 7 7 0 6 7 9 9 3]
$key:[0]
count:[2187]
array:[7 0 8 6 8 3 0 9 0 4 ... 7 5 7 7 0 6 7 9 9 3]
$key:[1]
count:[2187]
array:[3 9 9 7 6 0 7 7 5 7 ... 4 0 9 0 3 8 6 8 0 7]
===== length: 6561 =====
$key:[$a <=> $b]
count:[50834]
array:[0 0 0 0 0 0 0 0 0 0 ... 9 9 9 9 9 9 9 9 9 9]
$key:[-1]
count:[6560]
array:[5 6 1 7 9 9 7 6 7 6 ... 0 2 8 1 0 2 7 6 8 4]
$key:[0]
count:[6560]
array:[5 6 1 7 9 9 7 6 7 6 ... 0 2 8 1 0 2 7 6 8 4]
$key:[1]
count:[6560]
array:[4 8 6 7 2 0 1 8 2 0 ... 6 7 6 7 9 9 7 1 6 5]
===== length: 6562 =====
$key:[$a <=> $b]
count:[50755]
array:[0 0 0 0 0 0 0 0 0 0 ... 9 9 9 9 9 9 9 9 9 9]
$key:[-1]
count:[6561]
array:[6 6 3 8 5 3 5 1 6 1 ... 8 5 0 4 1 3 2 0 9 9]
$key:[0]
count:[6561]
array:[6 6 3 8 5 3 5 1 6 1 ... 8 5 0 4 1 3 2 0 9 9]
$key:[1]
count:[6561]
array:[9 9 0 2 3 1 4 0 5 8 ... 1 6 1 5 3 5 8 3 6 6]
===== length: 19683 =====
$key:[$a <=> $b]
count:[152997]
array:[0 0 0 0 0 0 0 0 0 0 ... 9 9 9 9 9 9 9 9 9 9]
$key:[-1]
count:[19682]
array:[0 2 6 1 7 8 3 3 7 6 ... 6 4 2 3 4 0 7 8 6 7]
$key:[0]
count:[19682]
array:[0 2 6 1 7 8 3 3 7 6 ... 6 4 2 3 4 0 7 8 6 7]
$key:[1]
count:[19682]
array:[7 6 8 7 0 4 3 2 4 6 ... 6 7 3 3 8 7 1 6 2 0]
===== length: 19684 =====
$key:[$a <=> $b]
count:[152923]
array:[0 0 0 0 0 0 0 0 0 0 ... 9 9 9 9 9 9 9 9 9 9]
$key:[-1]
count:[19683]
array:[0 4 2 3 6 9 6 7 3 2 ... 3 4 0 5 2 7 7 2 6 9]
$key:[0]
count:[19683]
array:[0 4 2 3 6 9 6 7 3 2 ... 3 4 0 5 2 7 7 2 6 9]
$key:[1]
count:[19683]
array:[9 6 2 7 7 2 5 0 4 3 ... 2 3 7 6 9 6 3 2 4 0]
===== length: 59049 =====
$key:[$a <=> $b]
count:[459848]
array:[0 0 0 0 0 0 0 0 0 0 ... 9 9 9 9 9 9 9 9 9 9]
$key:[-1]
count:[59048]
array:[2 7 6 7 1 7 0 9 0 7 ... 5 1 5 0 1 5 7 5 9 9]
$key:[0]
count:[59048]
array:[2 7 6 7 1 7 0 9 0 7 ... 5 1 5 0 1 5 7 5 9 9]
$key:[1]
count:[59048]
array:[9 9 5 7 5 1 0 5 1 5 ... 7 0 9 0 7 1 7 6 7 2]
===== length: 59050 =====
$key:[$a <=> $b]
count:[460469]
array:[0 0 0 0 0 0 0 0 0 0 ... 9 9 9 9 9 9 9 9 9 9]
$key:[-1]
count:[59049]
array:[9 6 3 2 4 5 6 9 2 4 ... 0 1 5 0 5 5 4 4 0 9]
$key:[0]
count:[59049]
array:[9 6 3 2 4 5 6 9 2 4 ... 0 1 5 0 5 5 4 4 0 9]
$key:[1]
count:[59049]
array:[9 0 4 4 5 5 0 5 1 0 ... 4 2 9 6 5 4 2 3 6 9]
</code>
##############
<br>
<small>
<strike>
RFC: Simple switches for 'sort' and numeric list 'reverse'
<br><br>
<b>reverse</b>: This trick seems to work <b>only</b> on lists of <b>unique numeric</b> values. Say we want to apply some function on original and reversed list. I'm not sure how, but sorting by <code>$a + $b</code> reverses a list. So we can pass 0 or 1 to multiply its result:<br>
<code>
tr/A-C/1-3/ for @original;
my @reversed = reverse @original;
some_sub( $_ ) for \@original, \@reversed;
print '-';
some_sub( [ sort { $_ * ( $a + $b ) } @original ] ) for 0, 1;
</code>
OUTPUT:
<code>
5 1 2 3 0 4
4 0 3 2 1 5
-
5 1 2 3 0 4
4 0 3 2 1 5
</code>
In case if list elements aren't unique, 'sort' sometimes returns incorrect but similar to expected results, e.g.:<br>
<code>
original: 7 1 0 9 8 0 7 7 8 0
reversed: 0 8 7 7 0 8 9 0 1 7
$a + $b : 0 8 9 0 1 7 0 8 7 7
</code>
So it can be useful using only on permutations, lists of unique keys, e.g. sorted-then-squeezed lists.
</strike>
<br>
++ 'sort { 1 * ( $a + $b ) }' didn't worked as a reverse with negative numbers, because they influence a final result of sort's sub.
</small>