6a sessió: Transmissió de paràmetres en PERL.

Si volem rebre paràmetres des del nostre script, utilitzarem aquest començament típic de PERL:

#!/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:

Les dades es tradueixen en una llista associativa, gràcies a la funció split. Normalment aquestes dades provenen de formularis, que envien les dades en parelles camp=valor separades pel caràcter &. Amb l'ordre split separem les parelles segons el caràcter & i construim una llista associativa segons el caràcter =.

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>
 
 

© Jordi Orts, abril 2001