SELFHTML/Aides à la navigation CGI/Perl Éléments de langage Perl |
Instructions conditionnelles | |
Instructions conditionnelles avec if, else et elsif |
|
Vous pouvez faire dépendre de conditions l'exécution d'instructions.
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Sortie du test</title>\n"; print "</head><body>\n"; if( $ENV{QUERY_STRING} eq "" ) { print "<b>Aucune donnée n'a été transmise au script!</b>\n"; } elsif( length($ENV{QUERY_STRING}) < 4 ) { print "<b>&Les données transmises contiennent moins de 4 caractères!</b>\n"; } elsif( length($ENV{QUERY_STRING}) > 8 ) { print "<b>&Les données transmises contiennent plus de 8 caractères!</b>\n"; } else { print "<p><b>Les données suivantes ont été transmises au script:</b><br> $ENV{QUERY_STRING}</p>"; (my $String, my $Salt) = split(/\+/,$ENV{QUERY_STRING}); my $CryptString = crypt($String,$Salt); print "<p><b>Les données cryptées sont:</b><br>$CryptString</p>\n"; } print "</body></html>\n"; |
Le script en exemple attend qu'une chaîne de caractères avec quatre signes au minimum et 8 signes au maximum lui soit transmise quand il est appelé. Il crypte ces données avec la fonction crypt et sort la valeur cryptée pour contrôle. Vous pouvez transmettre au script la chaîne de caractères comme paramètre quand vous l'appelez dans le navigateur. Si donc le script a comme adresse http://localhost/cgi-bin/crypt.pl, vous pouvez l'appeler avec http://localhost/cgi-bin/crypt.pl?Noceur, et le script crypte la cha1ine de caractères Noceur
d'après le standard de cryptage. Si par contre vous appelez le script sans paramètre ou que vous transmettez une chaîne de caractères trop courte ou trop longue, alors le script renvoie à la place un message d'erreur.
Pour exécuter ces actions en fonction des conditions, le script demande tout d'abord si la variable d'environnement CGI QUERY_STRING
est vide. Avec if
vous pouvez introduire une telle condition si-alors. Derrière suit, placée entre parenthèses, la formulation de la condition. Pour formuler ces conditions vous avez besoin soit de deux valeurs que vous pouvez comparer, soit de demander directement si une expression placée entre parenthèses est vraie ou fausse. Dans l'exemple deux valeurs sont comparées dans la condition, à savoir $ENV{QUERY_STRING}
(la variable d'environnement qui contient les paramètres transmis) avec ce qu'on appelle la chaîne de caractères vide, qui est marquée par des guillemets vides ""
. Le signe eq
placé entre les valeurs est un opérateur de comparaison pour chaînes de caractères. Il vous faut connaître les opérateurs de comparaison pour pouvoir formuler des conditions dans lesquelles deux valeurs sont comparées.
À la fin de la condition if
suit un bloc d'instructions, marqué comme d'habitude par les parenthèses accolades {
et }
. Entre les deux peuvent figurer autant d'instructions que vous voulez. Ces instructions ne seront ensuite exécutées que si la condition if
est remplie. Dans l'exemple il est demandé avec l'instruction if
si la variable d'environnement avec les données transmises est vide. Si c'est le cas, donc si cette condition est remplie, alors est sorti: Aucune donnée n'a été transmise au script!
. Les blocs d'instructions qui suivent après elsif
et else
, sont sautés dans ce cas.
Avec elsif
d'autres conditions peuvent être formulées. Ces conditions ne sont cependant vérifiées que si toutes les conditions qui la précèdent immédiatement sont fausses. Le deuxième elsif
dans l'exemple n'est donc évalué par Perl que si des données ont été transmises et si celles-ci ne contiennent pas moins de 4 caractères. Les deux conditions elsif
de l'exemple comparent à nouveau deux valeurs, à savoir la longueur des données transmises recherchée avec la fonction length, avec, pour chacune, un nombre invariable.
Seulement si toutes les conditions if
et elsif
sont fausses, l'embranchement else
sera exécuté. Celui-ci n'a plus besoin de condition, mais équivaut simplement à "autrement" -sinon. Étant donné que, dans l'exemple ci-dessus, les conditions notées auparavant capturent des erreurs, figure dans l'embranchement else
le code pour le "bon cas". Les données sont sorties pour contrôle, puis cryptées et sorties à nouveau sous leur forme cryptée.
Les parenthèses accolades après if
, elsif
ou else
doivent toujours être notées, même si une seule instruction y est notée. Il en va ici autrement en Perl que dans quelques autres langages, en JavaScript par exemple.
Les conditions peuvent aussi être formulées dans l'autre sens.
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Sortie du test</title>\n"; print "</head><body>\n"; unless( $ENV{QUERY_STRING} eq "confidentiel" ) { print "<b>Pas d'habilitation!</b>\n"; } else { open (FH, "</usr/bin/apache/conf/httpd.conf"); my @lignes_fichier = <FH>; close(FH); print "<h1>Configuration actuelle du serveur Apache</h1>\n"; print "<pre>@lignes_fichier</pre>\n"; } print "</body></html>\n"; |
Le script formule avec unless
une condition "si ce n'est pas". Dans la condition est comparé si la variable d'environnement QUERY_STRING
a la valeur confidentiel
. La condition est donc vraie si l'utilisateur a appelé le script dans le navigateur avec par exemple http://localhost/cgi-bin/show_apache.pl?confidentiel. Par unless
la condition est cependant niée en tant que tout. Les instructions qui figurent dans le bloc d'instructions placées dans les parenthèses accolades, et exécuté en fonction de unless
, ne sont exécutées dans l'exemple que si l'utilisateur a appelé le script sans transmettre le paramètre confidentiel
.
Dans ce cas, le script sort un message d'erreur dans le navigateur et saute l'embranchement else
. Si l'utilisateur a entré le bon paramètre, le script aboutit par contre dans l'embranchement else
. Là, il lit le fichier central de configuration du serveur Web Apache et sort son contenu dans le navigateur. Les fonctions Perl employées pour le faire sont open et close.
Pour exécuter une instruction distincte en fonction d'une condition, Perl dispose également d'une forme particulière abrégée de conditions.
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my @date_heure = localtime(time); my $heures = $date_heure[2]; print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Sortie du test</title></head><body>\n"; print "<h1>Bonjour!</h1>" if ( $heures > 5 && $heures < 10 ); print "<h1>Bonjour!</h1>" if ( $heures > 9 && $heures < 19 ); print "<h1>Bonsoir!</h1>" if ( $heures > 18 ); print "<h1>Salut oiseau de nuit!</h1>" unless ( $heures > 5 ); print "</body></html>\n"; |
Le script recherche avec la fonction localtime le date et l'heure sur le serveur. De toutes les données fournies par cette fonction, la partie heure est extraite et sauvegardée dans la scalaire $heures
. Le script envoie maintenant en code HTML au navigateur appelant, un titre avec un texte variant selon l'heure. Pour ce faire, l'instruction print
est placée devant et la condition respective est placée après. L'instruction print
n'est exécutée pour chacune d'entre elles, que si la condition notée derrière est remplie. Comme vous le voyez dans l'exemple, les conditions placées après sont possibles aussi bien avec if
qu'avec unless
.
La particularité de ces conditions placées après est que seule une instruction peut en dépendre. Car l'instruction complète, condition comprise, représente une seule instruction. C'est la raison pour laquelle il n'y a pas pour ces conditions de parenthèses accolades.
L'exemple montre aussi quelques autres conditions. Dans quelques cas sont liées deux conditions. Ainsi Bonjour
ne sera sorti que si la partie heures de l'heure du serveur est plus grande que 5 et plus petite que 10 , donc se situe entre 6 et 9. Deux conditions distinctes sont reliées ici avec l' opérateur logique &&
. La condition complète n'est dans ce cas remplie que si les deux conditions distinctes sont remplies.
Pour des conditions alternatives simples (soit-soit), existe une syntaxe spéciale que vous pouvez utiliser comme alternative à l'instruction if
et else
.
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Sortie du test</title>\n"; print "</head><body>\n"; my $resultat = $ENV{'HTTP_USER_AGENT'} =~ /MSIE/ ? "l'Explorer Internet" : "autre chose que l'Explorer Internet"; print "<b>Vous utilisez $resultat!</b>\n"; print "</body></html>\n"; |
Le script recherche, en évaluant la variable d'environnement HTTP_USER_AGENT
et à l'aide d'une expression régulière, si le navigateur appelant est un Explorer Internet MS ou non. Dans le code HTML que le script envoie au navigateur, figure ensuite soit: "Vous utilisez l'Explorer Internet" soit "Vous utilisez autre chose que l'Explorer Internet".
Une alternative simple (soit-soit) est introduite par une condition, dans l'exemple $ENV{'HTTP_USER_AGENT'} =~ /MSIE/. Ici /MSIE/
est une expression régulière et =~
est un opérateur de liaison spécial pour ces expressions régulières. Derrière est noté un point d'interrogation. Derrière le point d'interrogation est notée une instruction qui est exécutée si la condition est remplie. Derrière deux points sont notés :
puis une instruction pour le cas où la condition n'est pas remplie. Dans l'exemple, les deux instructions consistent ni plus ni moins dans la notations de valeurs qui doivent être attribuées à la scalaire $resultat
tout à fait à gauche de la formulation de la condition. De la même façon pourrait également figurer à cet endroit:
$ENV{'HTTP_USER_AGENT'} =~ /MSIE/ ? print "Vous utilisez l'Explorer Internet" : print "Vous n'utilisez pas l'Explorer Internet";
.
Boucles | |
Nombres | |
SELFHTML/Aides à la navigation CGI/Perl Éléments de langage Perl |
© 2001 Stefan Münz / © 2003 Traduction Serge François, 13405@free.fr
selfhtml@fr.selfhtml.org