Parameter parser

phaedrus at phaedrus at
Tue Nov 26 14:38:54 CST 2002

Theres no one here but us endangered bobtailed lesser plumed plum crested
symbol owls!

My solution, in two lines:

# test data
$_ = qq{param1 param2="value2" param3="value3 \\"foo\\""};

s{(\w+)\s*=?\s*(['"]?)(.*?)(?<!\\)\2}{$hash{$1} = $3;''}ge;
foreach my $i (keys %hash) { $hash{$i} =~s/\\//g }

# output results
foreach my $i (keys %hash) { print $i, ' = ', $hash{$i}, "\n"; }

# end perl

This should handle qouting with ' or ".
I'm sure there is a one line solution as well.

Thats somewhat similar to something I just did (this seems to happen
a lot in Perl-land).

I decided that CGI was entirely too large at 6695 lines, so I
decided to rewrite it, or atleast the parts of it that I actually use:

my $in = $ENV{QUERY_STRING}||''; $in.='&'; read(STDIN, $in, $ENV{CONTENT_LENGTH}||0, length($in));
map { $nam='word';s{^([a-z]+)=}{$nam=$1;''}e; tr/+/ /; s/%(..)/pack('c',hex($1))/ge; $$nam=$_; } split/[&;]/, $in;

This decodes GET and/or POST data.

I personally feel that something that can't be done in one line isn't
feel enough understood, or else it could be paired down to its essential core.

I'm reading in $ENV{QUERY_STRING} or else the empty string (to make warn happy),
concat'ing the '&' seperator, then reading from STDIN for whatever length 
$ENV{CONTENT_LENGTH} specifies starting at the end of what we read from the
query string. This way, GET variables have priority over POST variables.
I split that on ";" or "&", and do a few string operations (all of which
default to $_) on $_. First, replace a varname composed of lowercase letters
with '', stashing that in $nam over top of the default 'word'. Then I
decode what is left, using a symbol table lookup to store in the variable
specified by $nam. 

Oh?? And who makes you code Perl? Would it be, hmm, SATAN!?


> Hey all,
> I just implemented a parser that takes something like this:
> command param1 param2="value2" param3="value3 \"foo\""
> and puts the parameters and values into a hash.  The value for param1 
> would be "1".  I'm not sure I implemented it the best way, though.  I 
> thought I'd get some ideas from you folks to get a different 
> perspective.  I'll post what I did after I get some responses.  I don't 
> want to contaminate your thinking. :)

More information about the Phoenix-pm mailing list