adjohan has asked for the wisdom of the Perl Monks concerning the following question:

See the code below
$rboo = sub{($a,$b)=boo()}; $rzoo = sub{($a,$b)=zoo()}; $rhoo = sub{($a,$b)=hoo()}; print "return boo ", &$rboo, "\n" if (&$rboo); print "return zoo ", &$rzoo, "\n" if (&$rzoo); print "return hoo ", &$rhoo, "\n" if (&$rhoo); sub boo { return (1, 'bar'); } sub zoo { return (1, undef); } sub hoo { return 0; }
I'm not sure why it still print "return hoo". &$rhoo must evaluate to true... and I don't understand why?

Thanks,
Adrianus

Replies are listed 'Best First'.
Re: Returning array
by Joost (Canon) on Feb 26, 2005 at 18:15 UTC
    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; }

Re: Returning array
by gaal (Parson) on Feb 26, 2005 at 18:14 UTC
    $rhoo->() &$rhoo returns the two-element list (0, undef) which in scalar context evaluates to 2.

    Update: Don't listen to me, listen to Joost.