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";