SELFHTML/Quickbar
CGI/Perl
Éléments de langage Perl
![]() |
Instructions CGI typiques en Perl |
![]() |
|
![]() |
Vous pouvez utiliser le code Perl suivant pour lire par CGI les données d'un formulaire HTML quelconque. Pensez que ce n'est pas un script Perl complet mais à vrai dire une partie de programme indépendante que vous pouvez utiliser à des fins personnelles.
if($ENV{'REQUEST_METHOD'} eq 'GET') { $donnees = $ENV{'QUERY_STRING'} } else { read(STDIN, $donnees, $ENV{'CONTENT_LENGTH'}); } @champsformulaire = split(/&/, $donnees); foreach $ (@champsformulaire) { ($name, $value) = split(/=/, $); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/<!--(.|\n)*-->//g; $formulaire[$i] = $name; $i = $i + 1; $formulaire[$i] = $value; $i = $i + 1; } |
Le code Perl ci-dessus vérifie d'abord si le formulaire HTML utilise la méthode GET ou POST et prend les données transmises en fonction de la méthode. La méthode indiquée dans le formulaire HTML importe donc peu - ce code Perl accède dans tous les cas aux données transmises.
Ces données se trouvent dans un premier temps dans la variable scalaire simple
$donnees. La valeur de $donnees a, à ce stade,
l'aspect du
flux de données lors de la transmission de données de formulaire.
Avec l'instruction @champsformulaire = split(/&/, $donnees); la
chaîne de caractères $donnees est
transformée en liste. Comme signe de séparation qui, du flux de
données, fait des éléments de liste est mentionné le ET commercial (&).
Les différents champs du formulaire sont séparés les uns des autres par
ce signe dans le flux de données du formulaire.
Ensuite les champs respectifs de la nouvelle liste
@champsformulaire sont traités dans une
boucle
foreach. D'abord, chaque champ de formulaire est décomposé en
deux parties opération pour laquelle le signe égal est mentionné comme signe
de séparation. Les deux parties sont rangées dans les variables scalaires simples
$name et $value. Dans $name se trouve alors
exactement ce qui a été défini avec la mention name= dans le
champ correspondant du formulaire HTML. Dans $value figure ce que
l'utilisateur a entré ou choisi comme valeur pour l'élément correspondant du
formulaire. Supposons que le formulaire HTML contienne un
champ
de saisie à une ligne, ayant été défini avec <input name="surnom" size=60 maxlength=60>.
Supposons ensuite que l'utilisateur y ait saisi "noceur". Alors on aura pour ce champ de formulaire dans la variable scalaire simple
$name la valeur surnom, et dans la variable scalaire simple $value
la valeur noceur.
Avec les processus
de recherche et de remplacement dans les autres instructions de la
boucle for les caractères de contrôle parasites qui sont restés du flux de
données du formulaire sont retirés.
Les données du formulaire sont finalement écrites dans une liste @formulaire. Les éléments pairs de cette liste donc $formulaire[0], $formulaire[2], $formulaire[4] etc. contiennent les noms de champs que l'utilisateur a renseignés. Les éléments impairs, donc $formulaire[1], $formulaire[3], $formulaire[5] contiennent leurs données respectives, entrées par l'utilisateur. Vous pouvez traiter cette liste dans le déroulement ultérieur du script Perl.
Les codes présentés ici en exemple sont très rudimentaires et ont plutôt
l'objectif de présenter le principe du déroulement. Si vous avez besoin d'une
solution plus professionnelle, vous devez la programmer vous-même ou prendre
un script
Freeware ayant fait ses preuves.
![]() ![]() |
Les données d'un formulaire rempli peuvent être écrites sur le serveur, par exemple dans
un fichier évalué régulièrement par vos soins. La plupart des
annonceurs désirent cependant recevoir ces données tout de suite par courrier électronique.
Le code Perl qui suit est basé sur le code
Perl ci-dessus et doit donc figurer à la suite du même script.
$Mailprogramm = "/usr/lib/sendmail"; # voir explication ci-dessous $objetcourrier = "Formulaire-Feedback"; # voir explication ci-dessous $destinataire = "votrenom\@Provider\.xxx"; # voir explication ci-dessous $expediteur = $formulaire[1]; # voir explication ci-dessous $adresseexp = $formulaire[3]; # voir explication ci-dessous open(MAIL,"|$Mailprogramm -t") || die; print MAIL "To: $destinataire\n"; print MAIL "From: $adresseexp $expediteur\n"; print MAIL "objet: $objetcourrier\n\n"; $i = 0; $max = $#formulaire; for($i=0;$i<=$max;$i=$i+2) { print MAIL "$formulaire[$i]: $formulaire[$i+1]\n"; } close(MAIL); |
Le code Perl ci-dessus commence par définir quelques variables scalaires simples.
La première et la plus importante variable scalaire simple est $Mailprogramm.
Ici, il vous faut mentionner où sur l'ordinateur serveur se trouve le programme
qui travaille comme serveur pour la sortie des courriers. Le
programme standard pour l'envoi des courriers est le programme sendmail, qui est en service
sur presque tous les ordinateurs serveurs sur Internet - c'est pourquoi la
mention typique sur les serveurs Unix est /usr/lib/sendmail. Demandez,
le cas échéant, à votre fournisseur d'accès ce que vous devez mentionner
exactement à cet effet. Si cette valeur manque ou si elle est erronée, la transmission
par courrier électronique ne fonctionne pas!
Pour la variable scalaire simple$objetcourrier dans le code Perl ci-dessus,
vous pouvez mentionner l'objet de la réponse Mail qui vous est envoyée.
Pour la variable scalaire simple$destinataire vous devez mentionner votre
propre adresse électronique ou plutôt l'adresse à laquelle les courriers
doivent être envoyés.
Les deux variables scalaires simples $expediteur et $adresseexp n'ont
été à vrai dire définies que pour une meilleure lisibilité. À ces variables scalaires simples
sont affectées certains contenus du formulaire. Cela ne
marche de toutes façons que si votre formulaire contient un champ pour le nom
de celui qui le remplit et un champ pour son adresse électronique. Portez dans
ce cas les numéros d'index corrects # pour $formulaire[#] (À
ce sujet voyez un
peu plus haut).
Le code Perl ci-dessus ouvre ensuite dans la poursuite de son
exécution le fichier-programme du serveur Mail. L'option -t pour la
fonction open se réfère au programme supposé sendmail. Si
vous utilisez un autre programme ou êtes obligé de le faire, renseignez vous
sur la façon d'appeler ce programme avec des données à envoyer!
Si le programme ne peut pas être appelé, le script Perl ci dessus est terminé
sans commentaire avec die. À cet endroit, vous pouvez insérer un
traitement de l'erreur.
Avec les commandes print le script écrit les données qui lui sont connues dans l'entête de courrier. Chaque courrier électronique Internet a un format uniforme. Dans l'entête du courrier se trouvent différentes mentions. Certaines d'entre elles ne sont fixées que dans le cours du voyage vers le destinataire.
Dans la boucle
for les différentes données du formulaire sont écrites dans le
courrier électronique. Les noms de champs et les contenus de champs du
formulaire rempli sont séparés les uns des autres par des doubles points.
Les codes présentés ici en exemple sont très rudimentaires et ont plutôt
l'objectif de présenter le principe du déroulement. Si vous avez besoin d'une
solution plus professionnelle, vous devez la programmer vous-même ou prendre
un script
Freeware ayant fait ses preuves.
![]() ![]() |
Une des missions les plus importantes des scripts CGI est d'envoyer du code
HTML au navigateur WWW qui appelle. Pour le faire, vous pouvez insérer à votre
gré des variables de votre script Perl dans le code HTML.
Le code Perl qui suit est basé sur le code
Perl ci-dessus et doit donc figurer à la suite du même script. Il
envoie des remerciements à l'utilisateur qui a rempli le formulaire.
print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n"; print "<title>Merci!</title>\n"; print "</head>\n"; print "<body bgcolor=#FFFFFF text=#000000 link=#009900 vlink=006600 alink=#0000FF>\n"; print "<h1>Merci</h1>\n"; print "Nous nous réjouissons que vous ayez rempli notre \n"; print "formulaire. Ci-aprés vos données pour le contrôle:<p>\n"; for($i=0;$i<=$max;$i=$i+2) { print "<b>$formulaire[$i]:</b> $formulaire[$i+1]<br>\n"; } print "<p><hr noshade size=1><p>"; print "<i>Votre nom, <a href=\"mailto:votrenom\@Provider.xx\">votrenom\@Provider.xx</a></i>"; print "</body>\n"; print "</html>\n"; |
Vous pouvez écrire très facilement du code HTML en Perl grâce à la fonction print. Dans le code ci-dessus un fichier HTML complet est envoyé par ce moyen au navigateur WWW.
Pour ceci, la première instruction est importante. Elle s'intitule: print "Content-type: text/html\n\n";. Ceci n'est pas encore du code HTML. Le navigateur WWW qui reçoit le code attend d'abord un entête de fichier. Cet entête doit au moins contenir des informations sur le genre de données qui suit. Avec cette instruction vous faites part au navigateur que du code HTML va être envoyé. Absoluement indispensables aussi sont les deux \n\n à la fin!
Ensuite sont notées avec print les commandes habituelles
pour la construction d'un fichier. La boucle
for du milieu de l'exemple de code réclame une attention particulière.
C'est là que les contenus de la liste @formulaire
(voyez
un
peu plus haut) sont sortis formatés HTML. Cette possibilité de lier
les contenus de variable directement avec le code HTML qui doit sortir, est la
raison pour laquelle CGI est aussi souvent désigné comme "HTML
dynamique".
Pour terminer, vous devez encore porter attention à la sortie HTML de la commande mailto dans la partie inférieure de l'exemple de code. Si vous voulez sortir les repères HTML avec les mentions devant figurer entre guillemets ainsi que la mention href, alors il vous faut masquer les guillemets avec une barre oblique inversée. Sinon, l'interpréteur Perl enverrait un message d'erreur. De la même façon, il vous faut masquer le signe courrier électronique @, étant donné que dans le cas contraire, ce signe, dans une fonction print de Perl, serait interprété comme une liste à sortir.
![]() | |
après:![]() |
![]() |
avant:![]() |
![]() |
SELFHTML/Quickbar
CGI/Perl
Éléments de langage Perl
Serge François, 13405@free.fr