Boucles


Des possibilités plus interessantes arrivent avec les boucles et les branchements. Perl accepte différents branchements, qui ont tendance à ressembler à ceux du C, mais aussi au Pascal. En voici quelques un.


foreach (pour chaque)

Pour parcourir tous les éléments d'un tableau ou d'une structure listée quelconque (come un fichier, par exemple), le Perl utilise l'instruction foreach. Elle se présente comme ça :

foreach $bouchee (@nourriture)		# On passe en revue chaque élément.
				# et on l'appele $bouchee
{
	print "$bouchee\n";	# Affiche la bouchée
	print "Miam Miam\n";	# Trop bon :)
}
 

Les actions à exécuter à chaque fois sont encadrées par les accolades. Au premier passage, $bouchee a été affectée avec la première valeur de @nourriture. Au passage suivant, il aura la deuxième valeur, et ainsi de suite jusqu'à la fin. si @nourriture est vide, la boucle n'est jamais exécutée.


Tests

Les branchements suivant dépendent des tests binaires. En Perl, tout nombre non nul, et toute chaîne de caractère non vide est considéré comme vrai. 0 et "" (chaîne vide) sont considéré come vide. Voici quelques tests sur les nombres et chaînes.

$a == $b		# Est-ce que $a est numericalement égal à $b?
			   # Attention !! N'utilisez jamais l'opérateur = (affectation).
$a != $b		#  Est-ce que $a est numericalement différent à  $b?
$a eq $b		#  Est-ce que la chaîne $a est égale à la chaîne $b?
$a ne $b		#  Est-ce que la chaîne $a est différent à la chaîne $b?
 

On dispose aussi des opérateur logiques et, ou et non:

($a && $b)		# Est-ce que $a et $b sont vrai?
($a || $b)		# Est-ce que $a ou $b est vrai?
!($a)			# Est-ce que $a est faux?
 


for (pour

Le Perl dispose de la structure fro, qui est une copie de celle du C.

for (initialisation; test; incrémentation)
{
	 première action;
	 deuxième action;
	 etc...
}
 

D'abord, l'initialisation est exécutée. Puis, tant que le test est vrai, le bloc d'action est exécuté. Après l'exécution du bloc, on effectue l'incrémentation. Voici un exemple de boucle for, qui affice tous les nombres de 0 à 9 :

for ($i = 0; $i < 10; ++$i)	# commence à $i = 0
				# Continue tant que $i < 10
				# Incrémente $i avant de répéter.
{
	print "$i\n";
}
 


while and until (tant ...que et jusqu'à).

Voici un programme qui prend le clavier comme entrée, et qui ne continue que si un mot de passe correct a été fournit.

#!/usr/local/bin/perl
print "Mot de passe? ";		# Demande un mot de passe
$a = <STDIN>;			# Lit le mot entré
chop $a;			# Enlève le retour chariot de la fin de la ligne
while ($a ne "fred")		# Tant que le mot n'est pas bon
{
    print "Erreur. Essaye encore une fois :";	# Redemande
    $a = <STDIN>;		# Relit le mot entré
    chop $a;			# Enlève le retour chariot de la fin de la ligne
}
 

Le bloc entre accolade est exécuté tant que l'entrée au clavier n'est pas égale au mot de passe. La structure while est claire, mais c'est l'occasion de faire une remarque importante. D'abord, il est possible de lire le fichier du clavier sans l'ouvrir. Deuxièmement, quand le mot de passe est entrée, $a est fini par un retour chariot. La fonction chop enlève le dernier caractère de la ligne, qui est en l'occurence un retour chariot.

Pour effectuer un test sur la négation, on peut utiliser l'instruction until, de la même façon. Elle exécute le block jusqu'à ce que l'expresion soit vraie, et non pas tant qu'elle est vraie.

Une utilisation pratique de while et until, est de le mettre après le bloc, et non pas avant. Ceci nécessite l'utilisation de l'opérateur do pour noter le début du bloc. On place le test à la fin. Si on oublie le "Erreur. Essaye encore une fois :", on peut réécrire le programme ci-dessus comme ceci :

#!/usr/local/bin/perl
do
{
	"Mot de passe? ";		# Demande un mot de passe
	$a = <STDIN>;		# Lit le mot entré
	chop $a;		# Enlève le retour chariot de la fin de la ligne
}
while ($a ne "fred")		# Recommence tant que le mot n'est pas bon
 


Exercice

Modifiez le programme précédent, de façon à ce qu'il lise chaque ligne du fichier une par une, et qu'il renvoie une ligne avec le numéro de ligne. Vous devez avoir quelquechose comme ça :

1 root:oYpYXm/qRO6N2:0:0:Super-User:/:/bin/csh
2 sysadm:*:0:0:System V Administration:/usr/admin:/bin/sh
3 diag:*:0:996:Hardware Diagnostics:/usr/diags:/bin/csh
etc
 

Vous pouvez utiliser une structure comme ceci :

while ($line = <INFO>)
{
	...
}
 

Après ceci, essayez donc de modifier le programme pour que les lignes soit affichées comme suit : 001, 002, ..., 009, 010, 011, 012, etc. Pour faire ceci, vous n'aurez à changer une ligne en inserant 4 caractères supplémenaires. Le Perl est aussi simple que ça.


Precedent Start Suivant