--- Jan Gruber <[EMAIL PROTECTED]> wrote:
> Hi !
> 
> Sorry for the previous posting, im not yet completely awake ;o) 
> 
> > > >How can the param's be placed into a new hash?
> > >
> > > CGI.pm has a Vars() method, I believe, which returns a hash.
> > >
> > >   use CGI;
> > >   my $q = CGI->new;
> > >   $data = $q->Vars;
> > >
> > >   print $data->{field};  # etc.
> 
> Just a little add on:
> 
> I had to use  CGI ':cgi-lib'; to get the $q->Vars function working.
> I think %data = $q->vars would be better to read and I'm not sure if the 
> Vars() function returns a reference or a hash.

It returns either a hash or a hash reference, depending upon the context in which it 
was called:

    my $data = $q->Vars; # returns a hash ref

    my %data = $q->Vars; # returns a hash

However, I never use CGI::Vars().  The reason that I do not use it is due to how it 
returns the
data.  Check out this example:

C:\>perl -MCGI=:standard,:cgi-lib -e "use Data::Dumper; print Dumper {Vars}" color=red 
color=blue
$VAR1 = {
          'color' => 'red blue'
        };

As you can see, the value of 'color' is a scalar, not an array reference.  The 
individual elements
on separated by NULs (ASCII zero).  This can cause several problems.

1.  It's not intuitive to a new programmer what's going on.
2.  Due to the poison NUL byte hack, it's best not to introduce them.
3.  Why not just return a proper data structure?

As for item 3, I realize that Lincoln Stein did this to ease the migration 
difficulties of those
using the Perl4 cgi-lib.pl.  However, I can think of no other legitimate use.  Here's 
a nice,
clean method of dealing with this:

    use strict;
    use CGI qw/:standard/;
    my %form_data = map { $_, get_data($_) } param;

    sub get_data 
    {
        my $name   = shift;
        my @values = param( $name );
        return @values > 1
            ? \@values
            : $values[0];
    }

In this case, if you only have one value for a parameter, you will have a direct 
mapping of key to
a scalar value.  If you have more than one value, you will have a mapping of a key to 
an array
reference:

    name=Ovid;color=red;color=blue

Produces:

    $VAR1 = {
              'color' => ['red', 'blue'],
              'name' => 'Ovid'
            };

Cheers,
Curtis "Ovid" Poe

=====
"Ovid" on http://www.perlmonks.org/
Someone asked me how to count to 10 in Perl:
push@A,$_ for reverse q.e...q.n.;for(@A){$_=unpack(q|c|,$_);@a=split//;
shift@a;shift@a if $a[$[]eq$[;$_=join q||,@a};print $_,$/for reverse @A

__________________________________________________
Do You Yahoo!?
Great stuff seeking new owners in Yahoo! Auctions! 
http://auctions.yahoo.com

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to