#!/usr/bin/perl
print "content-type: text/html\n\n";
if ($ENV{'REQUEST_METHOD'}eq "POST")
{
read(STDIN,$entrada,$ENV{'CONTENT_LENGTH'});
}
elsif ($ENV{'REQUEST_METHOD'}eq "GET")
{
$entrada= $ENV{'QUERY_STRING'};
}
else
{
$entrada= $ARG[0];
}
foreach (split(/\&/,$entrada))
{
($clave,$valor)=split(/=/,$_);
$clave =~ tr/+/ /;
$clave =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack
("C", hex ($1))/eg;
$valor =~ tr/+/ /;
$valor =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack
("C", hex ($1))/eg;
$parametro{$clave}=$valor;
}
Com veiem, la transmissió de paràmetres fa un ús intensiu de les llistes associatives.
La llista associativa %ENV conté informació sobre l'entorn. Associat a la clau REQUEST_METHOD trobem el mètode utilitzat pel client per enviar els paràmetres. Normalment aquest mètode s'especifica als formularis HTML dintre del codi <FORM>:
<FORM action="/cgi-bin/llistat.cgi" method="get">
A l'exemple veiem que existeixen 3 mètodes:
D'aquesta manera podem accedir a un camp determinat del formulari mitjançant l'element $parametro{camp}:
$curso=$parametro{'GRUPO'};
Si us pregunteu perquè utilitzo noms de variable en castellà, ho faig per distingir els textos literals (en català) de les variables i constants (en castellà). Les funcions es diferencien ja que tenen nom anglès. Aventatges de saber idiomes !
Veiem un exemple per cercar una paraula als arxius .txt d'un directori:
#!/usr/bin/perl
print "content-type: text/html\n\n";
if ($ENV{'REQUEST_METHOD'}eq "POST")
{
read(STDIN,$entrada,$ENV{'CONTENT_LENGTH'});
}
elsif ($ENV{'REQUEST_METHOD'}eq "GET")
{
$entrada= $ENV{'QUERY_STRING'};
}
else
{
$entrada= $ARG[0];
}
foreach (split(/\&/,$entrada))
{
($clave,$valor)=split(/=/,$_);
$clave =~ tr/+/ /;
$clave =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack
("C", hex ($1))/eg;
$valor =~ tr/+/ /;
$valor =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack
("C", hex ($1))/eg;
$parametro{$clave}=$valor;
}
$directorio = $parametro{'CARPETA'};
$palabra=$parametro{'PALABRACLAVE'};
$resultado=`grep -i $palabra $directorio/*.txt`;
$resultado =~ s/\n/<br>/g;
print "<h2>Resultat de la cerca de $palabra
a $directorio/*.txt:</h2>";
print "$resultado";
La funció tr/caractervell/caracternou/ substitueix caractervell per caracternou. Aquí el fem servi per canviar la lletra + pel caracter espai, ja que aquest no es pot fer servir a les transmissions (indicaria final de paràmetres). El simbol ~ el fem servir per actuar sobre la pròpia variable.
La funció s/modelvell/modelnou/opcions cerca modelvell i el substitueix per modelnou fent servir les opcions opcions. En aquest cas fem ús d'aquesta funció per substituir el caracters codificats a la llista associativa de paràmetres, i el codi de canvi de línia \n pel codi HTML <br>. L'opció g implica un canvi de totes les coincidències, i l'opció e indica que s'ha d'interpretar (avaluar) segons el llenguatge PERL.
Per utilitzar aquest script utilitzaríem un formulari HTML com aquest:
<html>
<head>
<title>Untitled</title>
</head>
<body>
<h2>Cerca als arxius .txt</h2>
<form action="/cgi-bin/cerca.cgi" method="get">
<b>Directori: </b><input name="CARPETA"
type="text" value=""><br>
<b>Paraula a cercar:<input name="PALABRACLAVE"
type="text" value=""></b><br><br>
<input type="submit" value="D'acord">
</form>
</body>
</html>