in reply to Propagating calling context

I'd just be straightforward, nearly as you had done, but with less smoke, fewer mirrors:
sub middle_function { if (wantarray) { my @result = inner_function(); # modify @result as needed @result; } else { my $result = inner_function(); # modify $result as needed $result; } }

-- Randal L. Schwartz, Perl hacker

Replies are listed 'Best First'.
RE (tilly) 2: Propagating calling context
by tilly (Archbishop) on Aug 22, 2000 at 05:43 UTC
    Lemme guess, untested code? :-)

    I wrote the same thing, tried it with his test and realized that he differentiated between scalar and void context. FWIW my first try involved:

    push my @result, wantarray ? &inner_func() : scalar &inner_func();
    then I realized the problem, and came up with:
    sub outer_func { my @result; defined(wantarray) ? (push @result, wantarray ? &inner_func() : scalar &inner_func()) : &inner_func(); # do some other stuff return (wantarray ? (@result) : $result[0]); }
    Ick. :-( There are times you should be verbose. This is one of them...

    Personally I think your approach of separating the cases is cleaner. But honestly I have never once encountered a situation where I needed to propagate context in this manner...

      Personally I think your approach of separating the cases is cleaner. But honestly I have never once encountered a situation where I needed to propagate context in this manner...
      Oddly enough, I did. In the ill-fated chat2.pl. {grin}

      -- Randal L. Schwartz, Perl hacker