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

I'll outline what I'm attemping to do just in case I'm misguided. This is a web application using CGI.pm and HTML::Template

In a module I create a hash

our %cgi_vars = $q->Vars; ## Collects all my form data

Within a .cgi script, I update values in the %cgi_vars hash and now want to transfer the new values into my .tmpl using associate. In order to do this, I (think) I need to put the values back into the $q->param() object.

foreach (keys %cgi_vars) { $q->param($_ => $cgi_vars{$_}); }

This all seems to work until the value of $cgi_vars($_) = "". In that case the value remained unchanged, so I did some testing with just 1 element...

## This worked if ($cgi_vars{fname}) { $q->param('fname' => $cgi_vars{fname}); } else { $q->param('fname' => ""); } ## But this did not $q->param('fname' => $cgi_vars{fname});

Could someone explain where I'm going astray? Or maybe there's a better way to deal with this

Replies are listed 'Best First'.
Re: Using associate with HTML::Template
by Joost (Canon) on Apr 06, 2005 at 20:27 UTC
    That code seems to work for me:
    use CGI; my $q = CGI->new; use Data::Dumper; %cgi_vars = ( a => 1, fname => '', ); my $q = CGI->new(); ## This worked if ($cgi_vars{fname}) { $q->param('fname' => $cgi_vars{fname}); } else { $q->param('fname' => ""); } print Dumper($q->param('fname')); $q = CGI->new; ## But this did not $q->param('fname' => $cgi_vars{fname}); print Dumper($q->param('fname')); __END__ $VAR1 = ''; $VAR1 = '';
    Are you sure you're testing the values correctly? Remember that param('something') returns an empty list in list-context (not undef) if there is no parameter named 'something'.

      Thanks for the response. A test, using something similar, indeed works.
      It turns out that I had a different problem..
      $cgi_vars{fname} was indeed being set to "", but later in the script it was re-set to an 'undefined' value. This, of course, was not readily discernible in my test print statements.

      So this returned the original value if the $cgi_vars{fname} value is undefined.

      $q->param('fname' => $cgi_vars{fname});
Re: Using associate with HTML::Template
by Cody Pendant (Prior) on Apr 06, 2005 at 23:39 UTC
    It looks to me like you're doing everything twice. You've got "all my form data" in %cgi_vars? Haven't you also got all your form data in your $q object? You're taking your form data out, changing it then putting in back, then putting it into the HTML::Template object?

    You're doing everything three times, come to think of it.

    Your form data can be accessed by using your CGI object. Your CGI object's parameters can be changed in place, and your CGI object's parameters can be inserted directly into your HTML::Template object. So why do we need this other hash? Some simple code:

    #!/usr/bin/perl use CGI qw(:standard); my $q = CGI->new(); ## all your form data is now in $q use HTML::Template; my $template = HTML::Template->new( filename => '/path/to/file.tmpl' ); $q->param( -name => 'foo', -value => uc( $q->param( 'foo' ) ) ); ## change a parameter in-place $template->param( templatefoo => $q->param( 'foo' ), templatebar => $q->param( 'bar' ) ); # insert whichever form data you need into the template print $q->header(); print $template->output(); # and we're done


    ($_='kkvvttuubbooppuuiiffssqqffssmmiibbddllffss')
    =~y~b-v~a-z~s; print

      I had to think about that one for a bit.
      Every so often a '$q variable' needs to be assigned to a scalar variable because it would not interpolate

      my $foo = $dbh->selectrow_array("SELECT cola FROM table WHERE id=$q->p +aram('id')"); ## This does not work. ## I could do something similar to this to solve the problem. my $cgi_vars{id} = $q->param('id'); my $foo = $dbh->selectrow_array("SELECT cola FROM tablet WHERE id=$cgi +_vars{id}");

      This happens fairly frequently. So rather than assigning each variable as needed, I simply put all the cgi variables into a hash at the cost of a little performance.

      I could put only the altered variables back in the $q object but this one liner, again at the expense of performace, seemed like an easy way to do it.

      foreach (keys %cgi_vars) { $q->param($_ => $cgi_vars{$_}); }

      This is replaced with 'associate => $q', which is the reason for all this in the first place.

      $template->param( templatefoo => $q->param( 'foo' ), templatebar => $q->param( 'bar' ) );