if (condition) {
.....
} else {
.....
}
"", soit "0", alors la
condition est considérée comme false (undef est assimilé à false).
|
|
Les opérateurs de comparaison cmp et
<=> pour les chaînes et les nombres renvoient -1, 0 ou 1 selon que le premier argument est
inférieur, égal ou supérieur au second.
# façon de dire : "ouvre ce fichier ou arrete-toi !" open F, "fichier.txt" or die "impossible d'ouvrir le fichier\n"; # au lieu de dire : print "le nombre $a est pair" if $a%2==0; $a%2==0 and print "le nombre $a est pair";
print "Quel est votre âge : ?"
$age = <STDIN>; # lecture clavier
chomp($age);
if ($age < 18 ) {
# ou unless ($age >= 18 )
print("Vous êtes trop jeune pour voter!\n");
} else {
print("Vous pouvez voter!\n");
$inscrits++ # compte les inscrits au vote
}
instruction if condition;
instruction unless condition;
# $a%2 calcule le reste de la division de $a par 2
foreach $a (1..25) {
print "$a est pair\n" if $a%2==0 ;
print "$a est impair\n" unless $a%2==0 ;
}
if (test1) {
instruction1
} elsif (test2) {
instruction2
} elsif (test3) {
instruction3
} else {
# les 3 tests précédents ont alors échoué
instruction4
}
Syntaxe $variable = condition? expression si vrai:expression si faux; Exemples : $sup = $a>$b? $a:$b; print "Le plus grand de $a et de $b est $sup\n"; print "Combien d'enfants ? "; $nb=<>; chomp($nb); $pluriel= $nb > 1? "s": ""; print "J'ai $nb enfant$pluriel\n";
while (condition) {
bloc
}
|
until (condition) {
bloc
} |
Ces 2 boucles "tournent" tant que la condition demeure vraie (pour while) ou fausse (until).La condition est évaluée en début d'itération. Donc si cette condition est fausse dès le début, le bloc n'est jamais exécuté |
do {
bloc
} while condition; |
do {
bloc
} until condition ; |
La condition de poursuite est identique, mais ici la condition est évaluée en fin d'itération, donc le bloc est exécuté au moins une fois |
instruction while condition; instruction until condition; # lecture de lignes entrées au clavier mise dans un mémo open F, ">>memo.txt"; print while ( <>); close F; # compter jusqu'à 10, à partir (implicitement) de 0 print ++$i,"\n" until $i>= 10;
for fonctionne comme en C, Java ou PHP.
@liste=('a'..'z');
# ici, remarquer le contexte scalaire pour @liste
for ($i=0 ; $i < @liste ; $i++) {
print "Mot numéro $i ---> $liste[$i] \n";
}
$i=0;
foreach $mot (@liste) {
print "Mot numéro $i ---> $mot \n";
$i++;
}
foreach $i (0..@liste-1) {
print "Mot numéro $i ---> $liste[$i]\n";
}
# parcourir un fichier et sauter les lignes commentaires
# commençant par l'un des symboles # ou ;
open F, "/var/log/httpd/access_log";
while ($ligne = <F>) {
next if ($ligne =~ /^[#;]/);
}
last interrompt inconditionnellement l'exécution de la boucle, et passe à la fin du bloc.
# exemple : saisie d'une liste de mots jusqu'à la saisie de "quit"
while ($mot = <>) {
chomp($mot);
last if ($mot eq "quit");
# remarquer que le dernier mot "quit" n'est pas empilé !
push @mots, $mot;
}
print "liste des mots = @mots\n";
# déclaration
sub nom_fct {
# la liste @_ contient les éventuelles valeurs des paramètres effectifs
instructions;
}
# appel par invocation de la fct suivi de la liste des valeurs des paramètres effectifs
&nom_fct(liste) ;
return, ou à défaut ce sera la valeur de la dernière instruction.
Exemple (connexion.pl) :
#!/usr/bin/perl -w
print "Donnez l'hote : ";
$h = <>; chomp $h;
print "Donnez le login : ";
$u = <>; chomp $u;
print "Donnez le mot de passe : ";
$m = <>; chomp $m;
connexion($h, $u, $m);
sub connexion {
my($hote, $user, $mdp) = @_;
# my $mdp = pop @_;
# my $hote = shift;
print "$hote $user $mdp\n";
# simulation d'une connexion
$connexion=1;
print "connexion réussie de $user à $hote\n" if $connexion;
}
# routine de connexion à une base de données
sub connexion {
$hote = shift;
$login = shift;
$mdp = shift;
# plus rapide : ($hote, $login, $mdp) = @_;
print "$hote $login $mdp\n;
}
# appel
#!/usr/bin/perl
sub produit {
# le paramètre attendu ici dans @_ est une liste de nombres
my($p) = 1;
foreach (@_) {
$p *= $_;
}
# pour retourner le résultat, return peut être sous-entendu
$p;
}
# Utilisation : cet appel affiche 24
print &produit(1,2,3,4), "\n";
#!/usr/bin/perl -w
sub facto {
# sortie si pas de paramètre
die "Donnez un nombre entier positif\n" unless ($#_ ==0);
# récupération du paramètre
my $n= $_[0];
return 1 if $n==0;
# operateur conditionnel
return $n== 1 ? 1 : $n * facto($n-1);
}
# programme principal
print "Calcul récursif de N! pour N = ";
$N= <>; chop($N);
# le symbole & est facultatif pour l'appel
if (defined($N) && ($N >=0)) {
print "$N! = ", facto($N),"\n" ;
} else {
print "Donnez un nombre entier positif\n";
}
#!/usr/bin/perl -w # contexte.pl $x = 0; print ($x ? "vrai\n": "faux\n"); $x = ""; print ($x ? "vrai\n": "faux\n"); @x = (); print (@x ? "vrai\n": "faux\n"); my $x; print ($x ? "vrai\n": "faux\n");
#!/usr/bin/perl -w
$N=3;
print "Trouvez le mot de passe, $N essais maximum\n";
# variante : on pourrait stocker le mot de passe dans un fichier
$secret="perl";
$mdpc = crypt($secret,"pe");
# compteur du nombre d'essais
$i=0;
# indique si le mot de passe a bien été trouvé
$trouve = 0;
do {
$i++;
print "Essai numéro ... : donnez le mot de passe --> ";
$mot= <>;
chomp($mot);
$motc = crypt($mot,"pe");
print $motc,"\n";
$trouve =1 if ......
} while ...........;
if (......) {
print "Mot de passe trouvé à la tentative numéro $i, bienvenue !\n";
}
else {
print "Mot de passe non trouvé, au revoir ...\n";
}
sub lancer {
return (int rand(6) )+1;
}
# ./premier1.pl Recherche des nombres premiers jusqu'a N = 20 5 est premier 7 est premier 9 = 3 x 3 11 est premier 13 est premier 15 = 3 x 5 17 est premier 19 est premier Liste des nombres premiers jusqu'a 20 2 3 5 7 11 13 17 19