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

I'm trying to create a script taking in values from a form. The values in the form are created dynamically so my script can't know how many are there.
eg name1, name2, name3
Using &readParse; I normally access these things through $in{'name1'} and so on
but is it possible to do something like
for ($i = 1, $i <size, $i++)
$in{'name$i'}

I tried one or two way and couldn't get it working
Any ideas

Replies are listed 'Best First'.
Re: Handling Dynamically Created Forms
by OeufMayo (Curate) on Mar 21, 2001 at 02:54 UTC

    I believe that all your params passed to your script are in the %in hash. To iterate over the whole hash something like that might work:

    foreach my $i (keys %in){ print "$i: $in{$i}\n"; }

    As a side note, the ReadParse methode of CGI.pm (you are using CGI.pm, right?) is deprecated. You should not use it for new code.

    Official ways to fetch all parameters at once from a CGI are:

    @names = $query->param;
    Put all the parameters into an array.
    $query->import_names('R');
    Imports all the parameters name in a namespace (i.e. to access the parameter 'name', one should write $R::name.
    </code> <kbd>--
    my $OeufMayo = new PerlMonger::Paris({http => 'paris.mongueurs.net'});</kbd>
      To be more blatantly precise, you can grab the parameters "name1", "name2", etc. like this:
      foreach my $i (grep {/^name\d+$/} keys %in) { print "$i: $in{$i}\n"; }
      buckaduck
      I'm going to agree with the:
      foreach my $i (keys %in){ print "$i: $in{$i}\n"; }

      idea. That seems to be the best way, and it wouldnt be too hard to -use- the data either. If you're sending out an e-mail, just spit the key - value pairs out to wherever you need them. You could do something with a large case statement, but that depends on the app.

      Using a hidden field is nice, but it still doesnt get you the names of each of the keys. For that you still have to call keys %n, and you might as well just use the foreach loop.

      _14k4 - webmaster@860.org (www.poorheart.com)
Re: Handling Dynamically Created Forms
by bjelli (Pilgrim) on Mar 21, 2001 at 04:28 UTC

    I agree with what OeufMayo said about using CGI.pm, and recommend you use buckaducks excellent code-snippet.

    This code is maybe closer to what you had in mind:

    use CGI; $query = new CGI; while(1) { $i++; $value = $query->param("name$i"); last if ! $value; # do something with value };

    but BEWARE: this has several problems. for example: empty strings are treated as no value at all and break the loop!

    --
    Brigitte    'I never met a chocolate I didnt like'    Jellinek
    http://www.horus.com/~bjelli/         http://perlwelt.horus.at
A reply falls below the community's threshold of quality. You may see it by logging in.