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

Just to pick nits, no, you don't need variables neither in doublequotes nor heredocs, though the syntax is distracting in doublequotes.
use constant FOO => "BAR"; print << "BAZ" @{[ FOO ]} BAZ

I particularly enjoy this "poor man's templating" technique for very short CGI scripts where I don't want to load Template Toolkit II or some such, but still want to enjoy the benefits of separating application logic from display formatting. It can get tricky real quick like if you want to quote stuff inside the deref block though, so it doesn't scale very well. But that's okay - it keeps me from being falsely lazy when such a script happens to grow. :)

Of course, that's not real a solution for simple doublequotes, as

print "Hello, @{[ $q->param('real_name') ]}\n"; is of debatable beauty and a real pain to type out more than once or twice.

Makeshifts last the longest.

Replies are listed 'Best First'.
Re: Re^2: CGI and why?
by sauoq (Abbot) on Jan 01, 2003 at 06:10 UTC

    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.";
    
      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.";