Nos Perl nyelven ez nem túlzottan bonyolult. A legprimitívebb válasz az az, hogy használni kell például a cgi-lib.pl vagy CGI.pm modulokat, amelyek ezt elvégzik. De azért nézzük meg, hogy hogyan is történik ez az egész. Öt sorban el lehet intézni az egészet. (Hogy akkor miért 140KB a CGI.pm forrása?)
A pédaprogram:
#!/local/bin/perl
require 'state.pl';
sub cgi_convert {
my $p = shift;
$p =~ tr/+/ /; #minden + jelet szóközre cserél
$p =~ s/%([0-9a-f]{2})/pack("c",hex($1))/ige; # hexa kódokat vissza
return $p;
}
$get_parameter = $ENV{'QUERY_STRING'};
@get_parameters = split('&',$get_parameter);
for( @get_parameters ){
($p,$v) = split('=');
$p = cgi_convert $p;
$v = cgi_convert $v;
$GET{$p} = $v;
}
read STDIN, $post_parameter,$ENV{'CONTENT_LENGTH'};
@post_parameters = split('&',$post_parameter);
for( @post_parameters ){
($p,$v) = split('=');
$p = cgi_convert $p;
$v = cgi_convert $v;
$POST{$p} = $v;
}
$get_parameter = '';
while( ($p,$v) = each %GET ){
$get_parameter .= "<tr><td><b>$p</b></td><td>$v</td></tr>\n";
}
$post_parameter = '';
while( ($p,$v) = each %POST ){
$post_parameter .= "<tr><td><b>$p</b></td><td>$v</td></tr>\n";
}
print_http_state('200 OK');
print <<END;
Content-type: text/html
<HTML>
<BODY>
<h1>GET és POST paraméterek</h1>
<HR>
GET paraméter:<BR>
<table border=1>
$get_parameter
</table>
<HR>
POST paraméter:<BR>
<table border=1>
$post_parameter
</table>
</BODY>
</HTML>
END
amit a
<form method=POST action="http://www.emma.hu/cgitutorial/shwparlist.pl?birka=nem+mad%F3r">
<input type=hidden name=kakukk value="az egy madár">
<input type=hidden name=szarka value="ez is madár?">
<input type=submit value="Ezt kell megnyomni!">
</form>
birka | nem madór |
kakukk | az egy madár |
szarka | ez is madár? |
{my($p,$v); my @p; my $u = sub { $_[0] =~ tr/+/ /; $_[0] =~ s/%([0-9a-f]{2})/pack("c",hex($1))/ige; $_[0]; }; read STDIN, $p,$ENV{'CONTENT_LENGTH'}; @p = split('&',$p); push @p, split('&',$ENV{'QUERY_STRING'}); for(@p) { ($p,$v) = split('='); $p = &$u($p); $v = &$u($v); ${$::{$p}} = $v; }}Ez az ötsoros kis programdarab fogja a POST és GET paramétereket, dekódolja, és a main névterületre elhelyezi a változókat. Ha tehát van például egy URL:
http://myserver.mydomain.mycom:21/kakukk.pl?foo=barakkor a programdarab lefutása után lesz egy $foo nevű Perl változónk, amelynek az értéke bar. Nem törődik azokkal a paraméterekkel, amelyek több példányban is szerepelnek, és ha egy GET paraméternek ugyanaz a neve, mint egy POST paraméteréé, akkor azt a változót felülírja.