Initiation au Perl et Utilisation de scripts CGI CGI en Perl Initiation au Perl et Utilisation de scripts CGI jeudi 27 décembre 2018
Sommaire Initiation au Perl Principe du CGI (Common Gateway Interface) Exemples (du concret) Bibliothèques cgi-lib.pl et CGI.pm CGI en C/C++ Les SSI (Server Side Includes) Performances et Comparaison jeudi 27 décembre 2018
Initiation au Perl Historique Les atouts du Perl Les variables en Perl Manipulation des fichiers Les expressions régulières jeudi 27 décembre 2018
Initiation au Perl - Historique Practical Extraction and Report Language (ou Pathologically Eclectic Rubbish Lister) Créé par Larry Wall (linguiste de formation) en 1987 Ajout de fonctionnalités grâce au Web (utilisation des news notamment) jeudi 27 décembre 2018
Initiation au Perl – Les atouts Gratuit Portable Facilité d’utilisation Compilation "automatique" Fonctionnalités sur la recherche de motif et les chaînes de caractères performantes jeudi 27 décembre 2018
Initiation au Perl – Les variables Variables scalaires: $count = 0; $message = "Coucou le monde"; Listes et Tableaux: @tableau = (0, 3, 5); $tableau[0] = 1; # la valeur 0 est remplacée par 1 Tableaux associatifs: %user = ("nom", "Dupont", "prenom", "Paul"); # (nom et prenom) = keys, (Dupont et paul) = values $user {"prenom"} = "Marc"; # Paul devient Marc jeudi 27 décembre 2018
Initiation au Perl – Les variables (suite) Variables systèmes: $_ : Variable scalaire courante @_ : Variable courante $! : Message d'erreur système %ENV : Variables d'environnement et d'autres comme: $$ numéro du process (UNIX) $% numéro de la page du device de sortie $& la chaîne de caractères correspondant à la dernière recherche $' valeur suivant le mot recherché dans la chaîne trouvée $( gid réel du process (UNIX) $) gid effectif du process (UNIX) $* est à 1 si plusieurs lignes contiennent la chaîne recherchée $- nombre de lignes imprimées sur la page de sortie $+ la dernière correspondance trouvée par une recherche jeudi 27 décembre 2018
Initiation au Perl – Manipulation de fichiers Ouverture – Fermeture d'un fichier: open (FILE, "config.txt"); close (FILE); Notion de File Handle: $ligne = <FILE>; print FILE "Ajouter un message"; Entrée et sortie standard: $line = <STDIN>; # Entree standard (équivalent à <>) print STDOUT "Message dans la sortie standard"; jeudi 27 décembre 2018
Initiation au Perl – Expressions Régulières Les nouveaux opérateurs: split (/motif/, $chaine): On découpe une chaîne de caractères en mettant le résultat dans un tableau: @list = split (/o/, "coucou"); # $list[0] donne "c", $list[1] donne "uc" et $list[2] donne "u" L'opérateur de recherche $chaine =~ /motif/: L'opérateur =~ retourne "vrai" s'il trouve le motif dans la chaîne if ($line =~ /coucou/) { print $line; } # Ici, on affiche que si la chaîne $line contient "coucou" Note: /motif/ équivaut à $_ =~ /motif/ L'opérateur de substitution s/modèle/remplacement/: $msg = "Hihi, haha, hoho"; $msg =~ s/[iao]/ey/g; # $msg est devenu "Heyhey, heyhey, heyhey" jeudi 27 décembre 2018
Initiation au Perl – Expressions Régulières (suite) La syntaxe pour les motifs: Un ou plus +: /ab+c/ match pour abc, abbc, abbbc… Zéro ou plus *: /ab*c/ match pour ac, abc, abbc, abbbc… Zéro ou un ?: /ab?c/ match pour ac ou abc Groupes de caractères []: /[abc]/ match pour a, b ou c Début de chaîne ^: /^abc/ match les mots commençant par abc Fin de chaîne $: /abc$/ match les mots finissant par abc N'importe quel caractère .: /ab.c/ match pour abdc, abzc, abqc, abgc, abcc… Nombre d'occurrences {}: /ab{1,3}c/ match pour abc, abbc et abbbc Choix |: /abc|def/ match pour abc ou def etc… Séquence de modèles (): $chaine = "Mon poulet coûte 18.07 Euros"; $chaine =~ /-?(\d+)\.?(\d+)/; # $chaine contient alors 18.07 # la variable $1 vaut 18 et la variable $2 vaut 07 jeudi 27 décembre 2018
Principe du CGI Définition Schéma CGI avec Perl jeudi 27 décembre 2018
Principe du CGI - Définition Objectif: Dynamiser les pages WWW Applications exécutées sur le serveur HTTP Langages supportés: C/C++ Fortran PERL TCL Any Unix shell Visual Basic AppleScript jeudi 27 décembre 2018
Principe du CGI - Schéma Client WWW Serveur WWW Requête GET cgi-bin/toto.cgi HTTP/1.0 Démon httpd Exécution Script CGI Page dynamique HTTP 200 OK Server: Apache/2.5 Content-type: text/html <HTML> … </HTML> Affichage de la page jeudi 27 décembre 2018
Principe du CGI – avec Perl Librairies &ReadParse(); # Entrées dans %in Script CGI Entrées (Requête): $ENV{'REQUEST_METHOD'} (GET ou POST), $ENV{'QUERY_STRING'} (méthode GET), STDIN (méthode POST) Sorties (Réponse): STDOUT (En-tête Content-type + HTML) Compilation Exécution jeudi 27 décembre 2018
CGI par l'Exemple Mail anonyme Tableau de liens Schéma Formulaire HTML Script send_mail.cgi Tableau de liens Script link.cgi Affichage jeudi 27 décembre 2018
Exemples – Envoi de Mail (Schéma) form.html Script CGI mail 1ère étape <HTML> … </HTML> 2éme étape jeudi 27 décembre 2018
Exemples – Envoi de Mail (formulaire) <FORM ACTION="cgi-bin/send_mail.cgi" METHOD=POST> From: <INPUT TYPE="text" NAME="from" SIZE=50 MAXLENGTH=200> To: <INPUT TYPE="text" NAME="to" SIZE=50 MAXLENGTH=200> Subject: <INPUT TYPE="text" NAME="subject" SIZE=50 MAXLENGTH=200> Content: <TEXTAREA NAME="text" COLS=50 ROWS=10></TEXTAREA> <INPUT TYPE="submit" VALUE="submit"> <INPUT TYPE="reset" VALUE="reset"> </FORM> jeudi 27 décembre 2018
Exemples – Envoi de Mail (send_mail.cgi) #!/usr/bin/perl require "cgi-lib.pl"; # Utilisation de la librairie cgi-lib.pl (voir plus loin) &ReadParse; # Récupère les données du Formulaire $mail = "/usr/lib/sendmail"; # Commande sendmail $from = $in{from}; # Récupérer de l'adresse mail de l'expéditeur open (MAIL,"|$mail $in{to}"); # Création d'un pipe print MAIL <<"TAG"; From: $from Subject: $in{subject} To: $in{to} $in{text} TAG close(MAIL); Contenu du mail renvoyé jeudi 27 décembre 2018
Exemples – Envoi de Mail (suite de send_mail.cgi) print "Content-type: text/html\n\n"; # En-tête pour la réponse aux clients print <<"TAG"; <HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> Your e-mail has been sent...<BR> Thank you for use this page realised by Moi.<BR> <BR> Tschuss! </BODY> </HTML> TAG Page retournée au Client jeudi 27 décembre 2018
Exemples – Tableau de liens (schéma) lien direct: http://serveur/cgi-bin/links.cgi Script CGI 1ère étape data.txt <HTML> … </HTML> 2éme étape jeudi 27 décembre 2018
Exemples – Tableau de liens (données) Fichier links.txt: Francais http://www.alianwebserver.com/informatique/internet/cgi/default.htm Aide sur les CGIs Francais http://www.perl-gratuit.com Scripts CGI Perl gratuits Francais http://www.lecgi.net Aide à l'utilisation des CGIs Francais http://www.scripts-fr.com Toutes sortes de CGIs par thème Francais http://www.webdeveloppeur.com Des outils web utiles Francais http://guide.ungi.net Des cours sympas sur les technos Web en français Francais http://www.enstimac.fr/Perl/DocFr/perl.html Docs du Perl en Français Francais news:fr.comp.lang.perl News Anglais http://www.perl.org Le site officiel du Perl Anglais http://www.perl.com Perl.com The Source for Perl -- perl development, perl conferences Anglais http://stein.cshl.org/WWW/software/CGI CGI.pm Le site sur le package Anglais http://www.papillion.ne.us/~sthomas/cgi_in_c.html CGI en C Anglais http://perl.oreilly.com About Perl Anglais http://cgi-lib.berkeley.edu Le site de la librairie cgi-lib.pl Anglais http://hoohoo.ncsa.uiuc.edu/cgi The Common Gateway Interface Anglais http://www.freecode Des tonnes de bibliothèques vraiment utiles Anglais news:comp.lang.perl.misc News jeudi 27 décembre 2018
Exemples – Tableau de liens (script links.cgi) #!/usr/bin/perl print "Content-type: text/html\n\n"; # En-tête de la réponse print "<HTML><HEAD><TITLE>PERL Search Results</TITLE></HEAD>\n"; print "<BODY bgcolor=#FFFFFF>\n"; print<<"TAG"; <!– ENTETE DU TABLEAU --> <FONT SIZE=+1><B>CGI en Perl - les liens</B></FONT> <HR> <TABLE BORDER=2> <TR><TD><B>Type</B></TD> <TD><B>Links</B></TD> <TD><B>Description</B></TD></TR> TAG # Liste des liens du fichier: print "<CENTER>\n"; open (LINKDATA,"data/links.txt"); # Ouverture du fichier de données jeudi 27 décembre 2018
Exemples – Tableau de liens (suite de links.cgi) while (<LINKDATA>) { # Tant qu'il y a des données dans le fichier if ((!(/#.*/))&&(/.+/)){ # Si la ligne ne commence pas par # et n'est pas vide @data = split (/\t/,$_); # On découpe la ligne par tabulation $type = $data[0]; # Le type est dans la première colonne if ($data[0] eq $type_before) { # Si le type n'a pas changé $data[0]=""; # Le type ne sera pas affiché } $type_before = $type; # Le type d'avant print "<TR><TD>$data[0]</TD>"; # Affichage du type # Affichage du lien: print "<TD><A HREF=\"$data[1]\" TARGET=\"_blank\">$data[1]</A></TD>"; print "<TD>$data[2]</TD></TR>\n"; # Affichage de la description } } print "</TABLE>"; # Fin du tableau close (LINKDATA); # Fermeture du fichier print <<"TAG"; # Dernier affichage <HR><DIV ALIGN="center"><FONT SIZE=-2>Page réalisé par <A>HREF="mailto:christian\@favier.as">Christian FAVIER</A></FONT></DIV> </CENTER></BODY></HTML> TAG jeudi 27 décembre 2018
Exemples – Tableau de liens (affichage) jeudi 27 décembre 2018
Bibliothèques La librairie cgi-lib.pl Le package CGI.pm jeudi 27 décembre 2018
Bibliothèques – librairie cgi-lib.pl Le site: http://cgi-lib.berkeley.edu La fonction ReadParse: Recupère la requête dans le tableau %in quelque soit la méthode (GET ou POST). Utilisation: require "./cgi-lib.pl"; # Utilisation de la librairie &ReadParse(); # Lancement de la fonction $champ_toto = $in{toto}; # Récupération du champ toto Installation: Mettre dans le même répertoire que le script. jeudi 27 décembre 2018
Bibliothèques – package CGI.pm Le site: http://stein.cshl.org/WWW/software/CGI Méthode param: Permet de récupérer les paramètres de la requêtre de l'objet CGI quelque soit la méthode (GET ou POST). Utilisation: use CGI; # Pour utiliser le package CGI.pm $query = new CGI; # Nouvel instance de l'objet CGI # Récupération du champ toto: $champ_toto = $query->param('toto'); Installation: Mettre dans le répertoire 'lib' de Perl (CGI.pm est souvent installé par défaut). jeudi 27 décembre 2018
CGI en C/C++ Requête dans l'entrée standard Réponse HTML dans la sortie standard (sans oublier l'en-tête) Librairie cgic: http://www.boutell.com/cgic Autres librairies: http://www.freecode.com jeudi 27 décembre 2018
Les SSI (Server Side Includes) Code intégré dans le HTML <!--#cmd arg="xxx"> 6 commandes SSI: config: configuration des SSI echo: affichage de certaines variables SSI exec: exécution d'une commande shell ou d'un script CGI fzise: affiche la taille d'un fichier flastmod: affiche la date de dernière modification d'un fichier include: insertion d'un fichier jeudi 27 décembre 2018
Les SSI - Exemple Fichier example.shtml: jeudi 27 décembre 2018 <!--#config timefmt="%d/%m/%y - %H:%M:%S" --> <!–- Modification du format de la date: "timefmt" avec %d: jour, %m: mois, %y: année, %H: heure, %M: minute, %S: seconde --> Nom du fichier: <!--#echo var="DOCUMENT_NAME" --><BR> Liste des fichiers du répertoire: <BR> <PRE> <!--#exec cmd="ls -l" --> </PRE> Exécution du script example.cgi: <BR><!--#exec cgi="cgi-bin/example.cgi" --><BR> Taille du fichier: <!--#fsize file="example.shtml" -->.<BR> Dernière modification: <!--#flastmod file="example.shtml" -->.<BR> Insertion du fichier fin.html: <BR><!--#include file="fin.html" --> </HTML> jeudi 27 décembre 2018
Les SSI – Exemple (résultat) Affichage du fichier example.shtml: <HTML> <!-- Modification du format de la date: "timefmt" avec %d: jour, %m: mois, %y: année, %H: heure, %M: minute, %S: seconde --> Nom du fichier: example.shtml<BR> Liste des fichiers du répertoire: <BR> <PRE> total 80 drwxr-xr-x 2 apache apache 4096 Oct 26 13:37 addon-modules -rwxr-xr-x 1 root root 607 Nov 18 21:52 example.shtml -rw-r--r-- 1 root root 48 Nov 18 21:26 fin.html drwxr-xr-x 4 root root 4096 Nov 13 23:00 glooton -rw-r--r-- 1 apache apache 5333 Sep 12 13:24 index.shtml </PRE> Exécution du script example.cgi: <BR>Test dans le fichier example.cgi<BR> Taille du fichier: 1k.<BR> Dernière modification: 18/11/01 - 21:52:13.<BR> Insertion du fichier fin.html: <BR><B>Ceci est inclus dans le fichier fin.html</B> </HTML> jeudi 27 décembre 2018
Comparaisons Les "moins": Les "plus": Complexité du langage élevée (par rapport PHP, JSP ou ASP) Peu lisible (par rapport PHP, JSP ou ASP) Phase d'exécution: interprétation, compilation + lancement d'où naissance du Perl exécutable (ou utilisation du C/C++) Interprétation ligne par ligne (prog fonctionnelle) d'où naissance du Perl orienté objet Les "plus": Bonne portabilité (par rapport ASP ou PHP) Performance élevée (par rapport ASP ou PHP) Beaucoup de ressources accessibles (par rapport JSP ou ASP) Manipulation des fichiers et chaînes de caractères aisée Recherche de motif performante jeudi 27 décembre 2018
Bibliographie et liens CGI avec Perl par Eric Hermann - Edition Simon&Schuster Macmillan Perl 5 par David Till - Edition Simon&Schuster Macmillan Programmation CGI en Perl (2ème édition) - Edition O'Reilly Perl 5 par Johan Vromans - Edition O'Reilly Liens: http://www.perl.org : site officiel du Perl http://www.cgi-resources.com : scripts CGI http://guide.ungi.net : aide en français sur les technos web http://www.freecode.com : contient une liste de libraires pour le CGI jeudi 27 décembre 2018
Fin jeudi 27 décembre 2018