develooper Front page | perl.beginners | Postings from January 2002

Re: What's wrong with this?

Thread Previous | Thread Next
From:
Curtis Poe
Date:
January 31, 2002 08:30
Subject:
Re: What's wrong with this?
Message ID:
20020131163045.59318.qmail@web9101.mail.yahoo.com

--- Jan Gruber <Jan.Gruber@pollux.primacom.net> 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

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About