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". $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";
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 :
Ceci affichera : 'MedGi a un QI de 180 :]'
... @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.
2 - Les tableaux
On peut aussi stocker les variables dans un tableau indexé. Il suffit de remplacer
le '$' par un '@'. Par exemple :
$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 # %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 :
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{"HaxorZ"}="30"; if (condition) { # condition est vraie } Ici, condition est une expression Perl. Pour utiliser les conditions, vous
devez connaitres les opérateurs de comparaison :
Voici un exemple de la boucle while'. En gros, tant que '$variable' est
supérieure à 0, 'Commandes' est executé :
while ($variable >= 0) 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 ...] :
4 - Boucles & Conditions
Tous ceux qui ont déja programmé savent ce qu'est une condition. Pour les
autres, voici un petit exemple :
else { # condition est fausse }
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,
{
Commandes;
}
for((10,9,8,7,6,5,4,3,2,1,"BOOOM !")) print "Entrez votre Nick :"; 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 !";
{
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 :
$nick = <STDIN>;
print "Votre nick est $nick\n";
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. 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 :
<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 $_ 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 = $ENV{QUERY_STRING}; # Merci a Jedi pour son aide...
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...
---
<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>
# 'i' indique de ne pas faire la distinction entre minuscule et majuscules.
# Search Engine by MedGi
# -= medgi@caramail.com =-
$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";
# 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 !