http://www.perlmonks.org?node_id=117326


in reply to Re: Re: Re: Re: Stumped on an array ref error...
in thread Stumped on an array ref error...

Scalar -> one, Array/List -> many.

Take this line of code:

$cacheHOA{$sum}=($name);
There's a scalar on the left side and a one-element list on the right side. The left side determines the context. A hash value can only hold one thing, so it's scalar context. Perl evaluates the right side in scalar context.

The Camel makes it abundantly clear that there is no general rule for this type of evaluation. Contrast these two snippets:

$cacheHOA{$sum} = (1, 2, 3); $cacheHOA{$sum} = @values;
The same goes for this line:
$cacheHOA{$sum}=();
Contextually, it's the same thing. The list is just empty this time. However, hash autovivification does the right thing afterwards because of the current value of $cacheHOA{$sum} at that point. (Assign '1' to it instead of an empty list and see the warning this next line throws.)
push @{$cacheHOA{$sum}}, $name;
Perl reads that as 'treat whatever is in $cacheHOA{$sum} as an array reference, and stick $name on the end'. Different context, since there's no scalar assignment on the left side.

The trick is to make the right side of the assignment something that makes sense in scalar context. Since references are scalars, that's what you need. Either assign an array reference or an reference to an existing array.

$cacheHOA{$sum} = []; $cacheHOA{$sum} = [$name]; $cacheHOA{$sum} = \@names;
When you don't get what you expect, check the context.