Comme tout langage de programmation, Perl dispose de structures de contrôle.
if(expr) { block1 } else { block2 }
ou
if(expr) { block1 } elseif(expr2) { block2 }
Dans les deux cas block1
est exécuté si l'évaluation de expr
retourne une valeur positive. Dans le premier exemple,
block2
est exécuté dans tous les autres cas. Dans le second,
block2
est évalué seulement si expr2 retourne une valeur
positive.
Plusieurs elseif
peuvent être enchaênés.
if($a == "a") { print "$a\n"; } elseif($a == "b") { print "$a$a\n"; } elseif($a == "c") { print "$a$a$a\n"; } ...
foreach (table) { block; } while(expr) { block; }
La structure de contrôle foreach
permet d'executer
block
autant de fois qu'il y a d'éléments dans table
.
@tab = (1, 2, 3, 4, 5); $i = 0; foreach (@tab) { print "$i\n"; $i++; }
L'exemple ci-dessus affiche successivement les valeurs 0, 1, 2, 3 et
4. Nous avons vu dans la section Les variables
speciales
que la variable $_
prenait la
valeur de chaque élément d'une table passée dans une boucle
foreach
ou while
. Illustrons cette particularité en
simplifiant l'exemple précédent.
@tab = (1, 2, 3, 4, 5); foreach (@tab) { print "$_\n"; }
Cette fois, l'exemple affiche 1, 2, 3, 4 et 5. $_
prend
successivement chaque valeur des éléments de \@tab
.
Encore plus simple :
foreach (1 .. 5) { print "$_\n"; }
(1 .. 5) est un intervalle en Perl.
@tab = (1, 2, 3, 4, 5); while($i = shift(@tab)) { print "$i\n"; }
shift
retourne le premier élément de la table @tab
et le
supprime. Ainsi $i
prend successivement les valeurs 1, 2,
3, 4 et 5. La boucle s'arrête lorsque $i est vide c'est à dire
lorsqu'il n'y a plus d'éléments dans @tab
.
Perl dispose de quelques artifices permettant de rendre plus lisible le code écrit.
print $value if $value;
Le contenu de $value est affiché si la variable est définie. Cela évite d'avoir
if($value) { print $value; }
De même:
print $value unless ! $value;
Littéralement, on affiche la valeur de $value
A MOINS QUE
la variable ne soit pas définie (!
est l'opérateur non). Pour
être encore mieux compris d'un humain, on aurait pu écrire:
print $value unless ! defined $value;
De la même manière, on peut aussi utiliser while
.
print "/tmp/lock: exists\n" while -f "/tmp/lock";