SELFHTML

Instructions conditionnelles

Page d'information: vue d'ensemble

vers le bas Instructions conditionnelles avec if, else et elsif
vers le bas Instructions conditionnelles avec unless
vers le bas Conditions placées après
vers le bas Simple requête soit..., soit...

 vers le bas 

Instructions conditionnelles avec if, else et elsif

Vous pouvez faire dépendre de conditions l'exécution d'instructions.

Exemple d'un script CGI complet:

#!/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";

Explication:

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 Autre page d'information 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 Autre page d'information 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 Autre page d'information 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 Autre page d'information 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 Autre page d'information 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.

Attention:

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.

 vers le hautvers le bas 

Instructions conditionnelles avec unless

Les conditions peuvent aussi être formulées dans l'autre sens.

Exemple d'un script CGI complet:

#!/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";

Explication:

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 Autre page d'information open et Autre page d'information close.

 vers le hautvers le bas 

Conditions placées après

Pour exécuter une instruction distincte en fonction d'une condition, Perl dispose également d'une forme particulière abrégée de conditions.

Exemple d'un script CGI complet:

#!/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";

Explication:

Le script recherche avec la fonction Autre page d'information 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'Autre page d'information opérateur logique &&. La condition complète n'est dans ce cas remplie que si les deux conditions distinctes sont remplies.

 vers le hautvers le bas 

Simple requête soit..., soit...

Pour des conditions alternatives simples (soit-soit), existe une syntaxe spéciale que vous pouvez utiliser comme alternative à l'instruction if et else.

Exemple d'un script CGI complet:

#!/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";

Explication:

Le script recherche, en évaluant la variable d'environnement HTTP_USER_AGENT et à l'aide d'une Autre page d'information 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";.

 vers le haut
page suivante Autre page d'information Boucles
page précédente Autre page d'information Nombres
 

© 2001 Stefan Münz / © 2003 Traduction Adresse électronique Serge François, 13405@free.fr
Adresse électronique selfhtml@fr.selfhtml.org