My thinking is that is functionB does...
return %myhash;
...then it's therefore returning a hash. In which case to pass a reference to that to functionA it would have to be...
$obj->functionA({ $obj->functionB() });
But if functionB did...
return @myarray;
Then I'd have to do...
$obj->functionA([ $obj->functionB() ]);
And it functionB did return...
return $scalar or return \$ref
Then it would be...
$obj->functionA($obj->functionB());
My problem is that I don't know which one of those four possibilities functionB is going to do, and therefore don't know whether to wrap it in braces (for a hash ref) or square brackets (for an array ref) or nothing (for a scalar, or if it's already a reference).
You have got me thinking however that I should always be doing the square bracket array reference however, because functionA can always find a way to deal with that.
| [reply] [d/l] [select] |
My thinking is that is functionB does...
return %myhash;
...then it's therefore returning a hash.
Well, see, that's where your thinking is inconsistent with Perl. In Perl, the last expression evaluated in the subroutine (whether preceded by the keyword return or not) acts as if you had a long-distance assignment operation. For example, if that subroutine were to be called in a scalar context, you get:
$secret_return_value = %myhash;
and if called in a list context, you get:
@secret_return_value = %myhash;
You wouldn't call the latter "assigning a hash" would you? No. You are merely evaluating a hash in a list context, which by definition flattens it out into a bunch of key/value pairs. Similarly, the scalar context invocation uses the scalar value for a hash name.
So, again, I can see where your confusion results, but if you can follow my explanation, you'll see that the situations you keep talking about can never occur. And hence, your original question was nonsense.
| [reply] [d/l] [select] |