Sorry, one more oops $form_vars{$name} = [($form_vars{$name})] if (ref($form_vars{$name} ne "ARRAY"));
should be $form_vars{$name} = [($form_vars{$name})] if (ref($form_vars{$name}) ne "ARRAY"); Sorry about these, there were a few recommendations I've received, and I had not implemented them in my original copy before writing this post. So I decided to implement the recommendations before I sent it on to you guys. couple of typo's. That should be all of them though. Regards, David ----- Original Message ----- From: <[EMAIL PROTECTED]> To: "Connie Chan" <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]> Sent: Thursday, July 11, 2002 11:53 AM Subject: Re: What is this string type? How to play with? Connie, > ; has no problem, why you would like to escape( \ )it ? I know that = and ; don't have a problem, I escape them because I escape every special character, that way I don't have to worry about what I do and don't need to escape. I know, bad habit (old habits die hard). > Besides, if you 'next' it if that $variable is not a name=value pair, > so is that mean this var will throw away ? This is a safety net incase somebody types in the url with something like this: http://www.domain.com/test.cgi?namea=valuea&nameb&namec=valuec You don't try to split on = when there's not an = in there. Trust me, I've put a lot of thought into this code over the last 2 1/2 years. I don't particularly care for CGI.pm either (but we wont go into that), I wrote my own called Form.pm which I hope to get up on CPAN one of these days. It handles both GET and POST as well as command line parameters (Along with post [MIME], I also accept files). It also works on Linux and Windows. Its also much faster than CGI.pm because its strait to the point, the only thing its intended to do is retrieve data and give it in a useable format. > Hmmm... what is this purpose ? $name is probably going to be a > var's name, how come it goes with a blank ? and with an assumption > that the $name is coming as a URI escaped string ? Well that's exactly what we are doing, unescaping a URI, we just happen to split it into name and value before unescaping it (this is important incase somebody has a %26 in their name or value). > Just hard to imagine how come a request coming with same name. > Aren't we supposing the later come value with same name will overwrite > the first one ? How about this instance: http://www.domain.com/test.cgi?name=joe&prefscheckbox=YesEmailMe&prefscheckbox=YesPhoneMe&prefscheck box=YesSnailMailMe This is a scenario when you want all of the multiple values with the same name, so you need to put it into an array instead of a scalar. I knew right from when you mentioned $ENV{'QUERY_STRING'} That you were intending to write a form input parser. Well if you are only going to use get, consider the following: -------------------------------------------------------------------- my @variables = split(/[\&\;]/, $ENV{'QUERY_STRING'}); my %form_vars; foreach $variable (@variables) { next if ($variable !~ /\=/); my ($name, $value) = split(/\=/, $variable); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if ($value ne ""){ # remove this if statement if you want to keep pairs where the name has an empty value if (exists($form_vars{$name})) { # if this is the first of this form input name. $form_vars{$name} = $value; # setting the variable the hash with the name to the value } else { # for repeated times in with the same form input name $form_vars{$name} = [($form_vars{$name})] if (ref($form_vars{$name} ne "ARRAY")); # make this an array if this its not one yet push(@{$form_vars{$name}}, $value); # adding the next element to the list } } } -------------------------------------------------------------------- This essentially gives you a hash with name value pairs for every single value names, and an array ref for every name that has multiple values. Basically, it gives you anything that was sent (optionally even name empty value sets assuming you remove the if statement around the assignment block). Eventually when I get it on CPAN, it will be a simple as use Form; my %input = Form(); Anyway, good luck, David ----- Original Message ----- From: "Connie Chan" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]> Sent: Thursday, July 11, 2002 10:59 AM Subject: Re: What is this string type? How to play with? Hi David, Hehe... Thanks in advice. Anyway what I am looking for is making those stuff back to what they looks like when they come, that is, the $input in your script... However, may I have some questions about your sample ? =) > my @variables = split(/[\&\;]/, $input); ; has no problem, why you would like to escape( \ )it ? > next if ($variable !~ /\=/); = also no problem , why you would like to escape it too ? Besides, if you 'next' it if that $variable is not a name=value pair, so is that mean this var will throw away ? > $name =~ tr/+/ /; > $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; Hmmm... what is this purpose ? $name is probrably going to be a var's name, how come it goes with a blank ? and with an assumption that the $name is coming as a URI escaped string ? > ...... Keep in mind, you may have multiple > # values for the same name. Just hard to imagine how come a request coming with same name. Aren't we supposing the later come value with same name will overwrite the first one ? Maybe I am still new to Perl... so I'm try to write my script to handle a form request like this ? Would you and the list comment on me ? ( except telling me to use CGI, because I won't use it unless I have to deal with multipart form =)) my %data = undef; my $input = undef; ($ENV{REQUEST_METHOD} eq "POST") ? { read (STDIN, $input, $ENV{CONTENT_LENGTH)} : { $input = $ENV{QUERY_STRING}} ; my @vars = split (/\&/, $input); for (@vars) { my ($name, $value) = split (/=/, $_); $value=~ tr/+/ /; $value=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $data{$name} = $value; } Rgds, Connie > -------------------------------------------------------------------------- -- > my @variables = split(/[\&\;]/, $input); > foreach $variable (@variables) { > next if ($variable !~ /\=/); > > my ($name, $value) = split(/\=/, $variable); > > $name =~ tr/+/ /; > $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; > $value =~ tr/+/ /; > $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; > > # assignment to some form of a variable structure that you will be > # using out side this loop. Keep in mind, you may have multiple > # values for the same name. > } > -------------------------------------------------------------------------- -- > > Regards, > David > > > > ----- Original Message ----- > From: "Connie Chan" <[EMAIL PROTECTED]> > To: <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]> > Sent: Wednesday, July 10, 2002 4:21 PM > Subject: What is this string type? How to play with? > > > Hi all, > > With get method from form, we always see that the > $ENV{QUERY_STRING} like this : > &message=%20%2F%15+...&....... > > btw, what is the name of that string in types of ? Escape ? Unicode ? > > With simple tr/// and s///, I can get back what exact the input > is, but, how can I make a the input back to the.... above format ? > Totally have no idea... > > Rgds, > Connie > > > > > -- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]