in reply to Re^2: CGI and why?
in thread CGI and why?

Yes, you can do that if you really want to. Keep in mind, though, that will result in the sub being called in list context. If you want to force scalar context you will have to do so explicitly which makes an ugly construct even more unwieldy.

-sauoq
"My two cents aren't worth a dime.";

Replies are listed 'Best First'.
Re^4: CGI and why?
by Aristotle (Chancellor) on Jan 01, 2003 at 13:53 UTC
    Good catch. You could force scalar context by simply using ${\( $q->param('real_name') )} though - I just dislike this one and don't use it unless necessary because I find it way uglier than an arrayderef.

    Makeshifts last the longest.

      Good catch. You could force scalar context by simply using ${\( $q->param('real_name') )} though

      Bzzzzt.... :-)

      That is also list context. Here's a demonstration:

      $ perl -le 'sub f{wantarray?"list":"scalar"}print"${\(f())}"' list

      That code turns the list returned by the subroutine into a list of references. That's because \($foo, $bar) is the same as (\$foo, \$bar). That list of references is itself in scalar context. (All of the deref'ing constructs expect a scalar reference afterall, so it makes no difference whether you use ${} or @{} here.) In scalar context a list yields its last element.

      Voila! You dereference the last element in the list of references created from the list returned by the subroutine call.

      I think that ${\scalar f()} is the only real way to do that and that's hideous. I'd much prefer to assign to a variable and then just put the variable into the <<HERE document, especially if you need to do that more than once (and it's best to assume you will, right?)

      So, was that an even better catch? ;-)

      -sauoq
      "My two cents aren't worth a dime.";
      
        Hrmf.. I guess so.. in that case I'll just stick to @{[ scalar FOO() ]} which is as unwieldy, but at least not quite as ugly.

        Makeshifts last the longest.