in reply to how to define html::template for the following hash in perl/cgi

It looks to me like your needs would better be served by an array of hashes. You could change your structure to:

my @add=( { name=>"name1 ", type =>"text", default=>" " value=[""], entries=>"M". }, { name=>"name2 ", type=>"dropdown", req=>"prc", default=>" " value=["value1","value2","value3"], entries=>" " } );

Then it's just a simple matter of sending the arrayref to your template:

$tmpl->param( blah => \@add );

And then defining a template loop. Take a look at the HTML::Template docs for how to make a loop and use conditionals.

Replies are listed 'Best First'.
Re^2: how to define html::template for the following hash in perl/cgi
by radiantmatrix (Parson) on Nov 04, 2005 at 14:38 UTC

    Actually, the structure doesn't need to change at all, if the hash keys don't matter much (which they don't appear to). Just "cast" your hash of hashes into an array of hashes, like this:

    $tmpl->param( blah => [ values %add ] );

    The values piece generates a list containing the values (which are your inner hashes) inside %add; the square brackets make that list into an ARRAYref for the use of HTML::Template.

    Or, if you need to preserve the key value, you could create a map:

    $tmpl->param( blah => [ map { { %{$add{$_}}, 'key' => $_ } } keys %add + ] );

    That's a little hairy, so let me explain: the map returns a list of HASHrefs. Each of these comes from your %add hash, and is modified with a new member called 'key' with the value of the %add hash's key for the given element. Yes, that's still confusing. Here's what the resulting data structure looks like:

    $VAR1 = [ { 'req' => 'prc', 'value' => [ 'value1', 'value2', 'value3' ], 'entries' => ' ', 'name' => 'name2 ', 'type' => 'dropdown', 'default' => ' ', 'key' => 'hash2' }, { 'value' => [ '' ], 'entries' => 'M', 'name' => 'name1 ', 'type' => 'text', 'default' => ' ', 'key' => 'hash1' } ];
    <-radiant.matrix->
    A collection of thoughts and links from the minds of geeks
    The Code that can be seen is not the true Code
    "In any sufficiently large group of people, most are idiots" - Kaa's Law
      $tmpl->param( blah => [ values %add ] );

      That has the disadvantage of ending up with an unknown order of values, and my assumption (based on the hash key names) was that the OP wanted an ordered list. One could certainly do this, though:

      $tmpl->param( blah => [ map { $add{$_} } sort keys %add ] )