Quite right, I'd got caught by an optimization. I ran (adjusting code to your example)
for my $tab ( 1 .. 3 ) {
my @array = frobnicate($tab);
printf "Array ref: %s\n", \@array;
printf "Annoymous: %s\n", [@array];
}
sub frobnicate {
return ( 0 .. shift );
}
__END__
Array ref: ARRAY(0x826a924)
Annoymous: ARRAY(0x8183a54)
Array ref: ARRAY(0x826a924)
Annoymous: ARRAY(0x826d818)
Array ref: ARRAY(0x826a924)
Annoymous: ARRAY(0x82115f8)
The same address even though @array is declared in the loop. The variable is being reused. Assigning \@array to something prevents the optimization.
my %data;
for my $tab ( 1 .. 3 ) {
my @array = frobnicate($tab);
printf "Array ref: %s\n", \@array;
printf "Annoymous: %s\n", [@array];
$data{$tab} = \@array;
}
sub frobnicate {
return ( 0 .. shift );
}
__END__
Array ref: ARRAY(0x826a924)
Annoymous: ARRAY(0x8183a54)
Array ref: ARRAY(0x819f318)
Annoymous: ARRAY(0x8183798)
Array ref: ARRAY(0x826ade8)
Annoymous: ARRAY(0x819f304)
Something to bear in mind when benchmarking. |