
Genom att använda formulär kan du läsa in data som användaren skriver. Detta kan vara nödvändigt om man
exempelvis skall skriva en gästbok eller sökfunktion. Det finns 2 olika metoder att föra över data från
ett formulär till ditt script. Den ena metoden kallas POST och den andra GET. Den senare varianten används
av många sökmotorer på internet. Där skickas det inmatade datat med adressen till CGI-scriptet som ett antal
parametrar. Detta kan vara bra om du gör en sökning och vill göra en bookmark av det resultat du har
fått fram. Båda dessa metoder resulterar i att det inmatade datat hamnar i den såkallade miljödataarean
på webservern, "enviroment space" på engelska. Vi börjar med att läsa av ett formulär som använder metoden
POST. Först tittar vi på hur formuläret kan se ut.
<form action="/cgi-bin/myscript.pl" method="POST"> Ange ditt namn: <input type="text" name="namn"><br> <input type="submit" value="Skicka"> </form>
Sedan tittar vi på hur man tar emot datat. Obserera att datat från formuläret hamnar i hashen
form.
%form = get_form();
sub get_form {
my (%form,$buffer,$name,$value,$pair,@pairs);
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$name =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$name} = $value;
}
return %form;
}
Den andra metoden, GET, kan du läsa av på i princip samma sätt. Nackdelen med detta är att denna metod
inte kan hantera lika mycket data som POST. Observera att variabelnamnet (hashen) är ändrat till
query så att du skall kunna använda båda metoderna till samma script.
%query = get_query();
sub get_query {
my (%query,$buffer,$pair,$name,$value,@pairs);
if ($ENV{'QUERY_STRING'}) {
$buffer = "$ENV{'QUERY_STRING'}";
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$name =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$query{$name} = $value;
}
return %query;
}
}