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


in reply to Re: Idiom to return 0 or random number of array elements
in thread Idiom to return 0 or random number of array elements

Just to clarify what is going on, notice that the scalar is not required in:

$stats{ scalar( x() ) }++
That is, this:
$stats{ x() }++
produces numbers in the 0..9 range, as BrowserUk's original did, while this:
$stats{ scalar( my @r = x() ) }++
produces numbers in the range 1..10 because this time the scalar context is getting the number of items in the array, in contrast to the earlier scalar context which was getting the value of the last element in the list.

For example, a run of this program:

use strict; use warnings; use Data::Dumper; my @array = 0 .. 9; sub x { return @array[ 0 .. int(rand @array) ] } my %stats; $stats{ scalar( my @r = x() ) }++ for 1 .. 1000; print Dumper( \%stats );
produced:
$VAR1 = { '6' => 81, '3' => 110, '7' => 84, '9' => 94, '2' => 96, '8' => 98, '4' => 89, '1' => 123, '10' => 117, '5' => 108

Update: For more detail on array vs list context see: