in reply to Returning array

The return value of a a list assignment is not what you expected in scalar context.

Note that you're actually calling &$rhoo twice in two different contexts:

if (&$rhoo)
calls &$rhoo in scalar context, which in turn forces the returning statement ($a,$b)=hoo() in scalar context, and assigning to a list in scalar context returns the number of elements assigned - in this case, 1.

the second call (in the print argument list) is in list context, and in that case ($a,$b)=hoo() returns the actual list.

Your code is pretty complicated: you'd see the same behaviour with:

print "return hoo ", hoo(), "\n" if hoo(); sub hoo { ($a,$b) = 0; }