PERL / CGI scripts

 

Le perl est un language prenant le meilleur du C, des outils de scripts sous Unix, et un peu de Pascal. Il a été créé en 1988 par Larry Wall. Actuellement c'est l'un des languages les plus utilisés pour les applications internet (les cgi par exemple).

Le PERL est un language qui ne nécessite aucune compilation : on écrit un script et on l'execute pour voir directement son résultat. Mais il est tout de même possible de le compiler : si vous êtes sous windows, télécharger un compilateur sur http://www.activestate.com ou bien allez consulter nos archives; si vous êtes sous linux, je vous conseil d'utiliser l'interpréteur fournit avec votre version. Il doit se trouver dans /usr/bin/perl.

L'avantage du perl, c'est que c'est un language qui est "très" facile. En effet le célebre "Hello World" tient en deux petites lignes comme on peut le voir dans le fichier hello.pl :

#!/usr/bin/perl
print "Hello World\n";

Tandis que l'équivalent en C est un peu plus compliqué. C'est un code beaucoup plus long, et il y a beaucoup plus de risques de bugs ( evidemment pas dans un code aussi court et aussi basique ! ) :

#include
main()
{
printf"Hello World\";
return 0;<
}

Maintenant, pour executer ce programme, un simple "perl./nom_du_programme" sera suffisant. Vous pouvez aussi rendre ce programme executable grace à la commande "chmode +x ./nom_du_prog", puis en l'executant par "./nom_du_prog".


1 - Les variables


Passons maintenant au choses sérieuses. Tout d'abord, le stockage des variables. Cette tâche est très facile en perl, puisque on a juste besoin de la déclarer, et c'est tout. Si on veut stocker une chaine de caractere, il suffit de faire cela :

$nom = "MedGi";

Notez qu'une variable commence toujours par '$'. Si maintenant vous voulez stocker un nombre, il vous suffira de faire cela :

$nombre = 180;

Enfin, pour afficher ces variables, il vous suffit de mettre cette ligne :

print "$nom a un QI de $nombre :]\n";

Ceci affichera : 'MedGi a un QI de 180 :]' ...


2 - Les tableaux



On peut aussi stocker les variables dans un tableau indexé. Il suffit de remplacer le '$' par un '@'. Par exemple :

@site = ("madchat","skreel","securiweb");

Ce tableau contient trois éléments que l'on peut afficher ainsi : '$site[2]', qui correspond à la variable contenant 'securiweb'. En effet, les éléments sont ici numérotés de 0 à 2. Vous pouvez ajouter une variable grace à la commande 'push' ('pop' pour en enlever une). De plus, la fonction push retourne la taille de la liste apres modification :

# Apres opération, $a vaut 4.
$new = push(@site,"nouveau_site")

Il y a encore beaucoup d'autre opération possible, tel 'sort', pour trier la liste et 'reverse' pour inverser tout les éléments. Notez que les commentaires sont précédés du signe #


3 - Les tables de hash



Les tableaux utilisant les préfixe '%' sont des tables de hash : il suffit de donner une clef comme paramètre pour trouver la valeure qui lui est associée. Le nombre d'éléments dans ces tableaux est donc toujours pair :

%qi = ("MedGi","180","LamerZ",25");

Il suffit d'utiliser l'instruction '$qi{"LamerZ"} pour trouver le QI de LamerZ. Pour ajouter de nouveaux éléments, faites tout simplement :

$qi{"HaxorZ"}="30";


4 - Boucles & Conditions



Tous ceux qui ont déja programmé savent ce qu'est une condition. Pour les autres, voici un petit exemple :

if (condition) { # condition est vraie }
else { # condition est fausse }

Ici, condition est une expression Perl. Pour utiliser les conditions, vous devez connaitres les opérateurs de comparaison :


   Nombres  Chaînes
 egal  ==  eq
 différent  !=  ne
 Supérieur  >  gt
 Inférieur  <  lt
 Supérieur ou égal  >=  ge
 Inférieur ou égal  <=  le


A eux s'ajoute différents opérateurs comme '&&' (et), '||' (ou) et '!' (non). Voyons maintenant les boucles. La construction est assez proche du C. Nous ne verrons ici que la boucle 'while' et la boucle 'for', mais sachez qu'il y en a d'autre de disponible,

Voici un exemple de la boucle while'. En gros, tant que '$variable' est supérieure à 0, 'Commandes' est executé :

while ($variable >= 0)
{
Commandes;
}

Et voici un exemple de la boucle for. Ici, il y à un compte à rebours allant de 10 à 1, puis affichant le texte 'BOOOM !'. La variable '$_' est en fait une variable "magique" :) ! [Explication un peu plus loin ...] :

for((10,9,8,7,6,5,4,3,2,1,"BOOOM !"))
{
print "$_\n";
}



5 - Le traitement de fichiers



Dans un shell UNIX, les connexion entrées/sorties sont gérées par '<STDIN>' et '<STDOUT>'. Voici un exemple de script utilisant ces fonctions :

print "Entrez votre Nick :";
$nick = <STDIN>;
print "Votre nick est $nick\n";

A noter que '\n' sert à revenir à la ligne. Pour ouvrir d'autre descripteurs de fichiers, on utilise la commande 'open'. Par exemple, pour afficher le contenu du fichier '/etc/passwd', on utilisera le script suivant :

open(OF,"/etc/passwd") || die "Impossible d'ouvrir ce fichier !";
while($ligne = <OF>)
{
print $ligne;
}

A noter que l'instruction 'die' permet de terminer l'application, si l'on n'arrive pas à ouvrir le fichier.


6 - Les Expressions Régulières (E.R)



.  Remplace n'importe quel caractère
^  Début de ligne
$  Fin de ligne
*  0 ou plusieurs itérations de l'E.R précédente.
+  1 ou plusieurs itérations de l'E.R précédente.
{m,M}  minimum m et Maximum M itération de l'E.R précédente.
[ ... ]  Dénote une classe de caractère à appareiller. Exemple : [A-Z ] dénote tout les caractères majuscules.
( ... | ... | ... )  On choisit une des 3 alternatives.
\w  n'importe quel caractère.
\s  un espace
\d  un chiffre
\b  permet de délimiter un mot
\n, \r, \f, ...  Pareil que en C
\1 ... \9  référence aux expressions déja trouvées, celles entre ()



7 - CGI (Common Gateway Interface)



Maintenant que vous avez les bases du perl nous allons programmer votre premier CGI. Il faut savoir que les CGI ne sont pas authorisé partout. En effet, des hébergeurs comme MultiMania les refuse, pour la simple raison qu'ils permettent d'acceder au fichier d'un visiteur en toute libertée...

Bon revenons à notre CGI. Nous allons coder un mini-moteur de recherche pour votre page web. La première étape est bien évidemment de créer la page web avec le formulaire :


Entrez un mot clé :
Cet exemple ne fonctionnera que si vous etes sous linux !
Trouvez le source du script dans bin/search.cgi


---

<html>
<head>
<title>Search Engine -=- by MedGi</title>
</head>
<body>
<form method="get" action="search.cgi">
<center>
Entrez un mot clé :
<input name="search" type="text"></input>
<input type="submit"></input>
</center>
</form>
</body>
</html>

---

Nous obtenons alors une zone de texte modifiable, et un bouton, qui permet de lancer le programme 'search.cgi', qui effectuera la recherche. Ce qu'à tapé l'utilisateur sera stocké dans une variable d'environnement nommée 'QUERY_STRING', sous la forme 'search= mot_clef'. On va donc récupérer ce mot clef :

$SEARCH = $ENV{QUERY_STRING}

et isoler ce qui se trouve après 'search=' : On remplace 'search=' par rien du tout. Si l'opération se passe mal, on arrete tout à l'aide de la commande 'die'.

$SEARCH =~s/^search=//o || die "Err0r !";

'=~' est un opérateur assez particulier : il indique que l'opération qui suit porte sur la variable qui précède car, par défaut c'est $_ qui est utilisée (sic!). Nous allons ensuite effectuer une recherche dans chaque fichier HTML :

On récupère le contenu du repertoire courant, on cherche les éléments dont l'extension est '.html', et on les place dans une structure linéaire quelquoncque, qu'on scanne... Tout d'abord, indiquons que l'on ne s'intéresse qu'aux fichiers '.html' :

while (<*.html>)

Chaque nom sera temporairement présent dans '$_'. Copions les dans une autre variable, $FICHIER. Maintenant, il faut ouvrir ce fichier pour effectuer la recherche :

open FICHIER;

Seulement, pendant que le CGI scanne le fichier, il risque de tomber sur des tags HTML, qui risquent de perturber la recherche et l'affichage. Nous allons donc à nouveau utiliser l'instruction '/s' pour effacer tout ce qui est contenu entre '<' et '>' :

s/<[^>]+>//go

Il s'agit du même principe que précédemment, mais au lieu de '\w' (n'importe quelle lettre), on cherche plutot une succession de caractères autres que le '>' entre le tag : c'est le rôle de '[^>]'. L'option 'g' signifie que le remplacement peut avoir lieu plusieurs fois sur la même chaine. L'option 'o' signifie que l'expression à rechercher est constante, et qu'elle peut être compilée définitivement. Maintenant, affichons la ligne contenant le mot clef recherché :

print"$_\n" if /$SEARCH/i;

# /$SEARCH/i est vérifié si $SEARCH est trouvé dans $_
# 'i' indique de ne pas faire la distinction entre minuscule et majuscules.

Voilà c'est tout pour notre moteur de recherche. Le reste ne sert qu'à contenter les navigateurs web. Voici donc le script final :

8 - Fichier search.cgi

#!/usr/bin/perl
# Search Engine by MedGi
# -= medgi@caramail.com =-

$SEARCH = $ENV{QUERY_STRING};
$RECH =~s/^search=//o || die "Err0r !";
print "Content-type: text/html\n\n";
print "<HTML><HEAD><TITLE> Recherche de [$SEARCH]</TITLE></HEAD><BODY>\n";
<while (<*.html>)
{
$FICHIER = $_;
OPEN FICHIER;
while(<FICHIER>)
{
s/<[^>]+>//go;
print "<A HREF="\"$FICHIER\"><B>$FICHIER</B> : ";
print "<EM>$_</EM></A><BR> \n" if /$SEARCH/i;
}
close FICHIER;
}
print "</BODY></HTML>\n";

# Merci a Jedi pour son aide...
# N'hesitez pas a me mail vos questions.


Voilà, c'est la fin de cet article. Si vous n'avez pas tout compris, contactez-moi. Bien sur, je ne vous ai donné qu'un minime aperçu du PERL, et des CGI; a vous de continuer. Si vous avez codé des CGI intéressants, envoyer les moi à l'adresse suivant : medgi@tipiak.net. Merci !