< Programmation Perl

Boucles et syntaxe

Les boucles permettent simplement de ré-exécuter un bloc de code. Perl offre des outils très puissants pour parcourir aisément des listes (tableaux, tableaux associatifs).

Boucle while et until

Boucle classique, déjà vue dans un bon nombre de langages.

Syntaxe

1 while( expression ) { instructions }
2 until( expression ) { instructions }

La seule différence entre while et until est que while boucle tant que l'expression est vraie, until jusqu'à ce qu'elle le soit.

exemples

 1 # while
 2 my @fruits = qw/ cerise pomme pastèque /;
 3 while( @fruits ) # une fois la liste @fruits vide, l'expression sera évaluée fausse
 4 {
 5         say pop @fruits; # rappel : pop supprime le dernier élément et le retourne
 6 }
 7 
 8 # until
 9 @fruits = qw/ cerise pomme pastèque /;
10 until ( !(@fruits) ) # liste vide = faux, !faux = vrai, until s'arrête
11 {
12         say pop @fruits; # pastèquepommecerise
13 }

Tant qu'il reste des éléments dans @fruits on boucle, et à chaque itération on pop (suppression du dernier élément d'une liste) un élément qu'on affiche.

Boucle for

Permet de boucler comme dans le langage C.

Syntaxe

1 for([expression] ; [expression] ; [expression]) { instructions }

La première expression est ce qui est effectué avant de commencer à boucler, la seconde est un test qui est effectué à chaque début de boucle, pour savoir si on continue de boucler, la dernière est une expression qui s'effectue à chaque fin d'itération.

Vous aurez remarqué que les 3 expressions sont écrites entre crochets [], c'est parce qu'elles sont toutes les 3 facultatives.

exemples

1 my @fruits = qw/ cerise pomme pastèque /;
2 for(my $i = 0 ; $i < @fruits ; $i++) # $... = contexte scalaire donc "scalar @fruits" est facultatif 
3 {
4         say $fruits[$i]; # $i ème élément de la liste @fruits
5 }
explications
2 for(my $i = 0 ; $i < @fruits ; $i++)

Première expression : on crée la variable $i qu'on initialise à 0. Seconde expression : on teste si $i est inférieure à la taille de @fruits. Dans cette condition, on utilise l'opérateur numérique < qui force le contexte scalaire, donc @fruits renvoie son nombre d'éléments. Troisième expression, on incrémente $i (à chaque fin de boucle).

4 say $fruits[$i];

On affiche la ième valeur de la liste @fruits. Ceci se rapproche de la manière de boucler sur des listes et tableaux dans d'autres langages.

Boucle do while

La différence entre une boucle while comme vu plus haut et une boucle do while est qu'on rentre déjà une première fois dans la boucle même si la condition du while n'est pas vraie.

Syntaxe

1 do { instructions } while (expression);
2 do { instructions } until (expression);

exemples

 1 #!/usr/bin/perl -w
 2 use strict;
 3 
 4 my $valeur_max = 6;
 5 my $indice = 0;
 6 do
 7 {  
 8         say "$indice "; # 0 1 2 3 4 5
 9 } while ++$indice < $valeur_max ;
10 
11 print "\n";
12 
13 # $indice > 6
14 $indice = 9;
15 do
16 { 
17         say "$indice "; # 9 tout seul
18 } while ++$indice < $valeur_max ;

On effectue la boucle de toutes façons une fois. Si $indice est déjà égal ou supérieur à $valeur_max on l'affichera au moins une fois.

Boucle foreach

Permet de parcourir toute une liste (tableau, tableau associatif).

Syntaxe

1 foreach my $variable ( tableau ) { instructions }
2 instruction foreach ( tableau ) ;

exemples

1 my @fruits = qw/ cerise pomme pastèque /;
2 foreach my $fruit (@fruits)
3 {
4         say  "$fruit "; # cerise pomme pastèque 
5 }

Un exemple simple pour montrer la concision d'un code Perl. Nous verrons plus loin les mécanismes qui permettent ceci :

1 my @fruits = qw/ cerise pomme pastèque /;
2 say foreach "@fruits";

Boucle sur un tableau associatif

Il y a plusieurs façons de faire.

Syntaxe

1 foreach my $cle (keys %tab_asso) { instructions } # clé courante = $cle et valeur courante = $tab_asso{$cle}
2 while (my ($cle, $valeur) = each %tab_asso) { }

exemples

En utilisant foreach et keys :

Contrairement à "for", l‘ordre de sortie est aléatoire, néanmoins tout y est !

1 my %tab_asso = qw/ a 1 b 2 c 3 d 4 e 5/;
2 
3 foreach my $cle (keys %tab_asso)
4 {
5         say $cle , $tab_asso{$cle}," "; # c3 d4 e5 a1 b2 ou bien d4 b2 e5 a1 c3 ou bien …
6 }

Avec while et each :

1 my %tab_asso = qw/ a 1 b 2 c 3 d 4 e 5/;
2 
3 while (my ($cle, $valeur) = each %tab_asso)
4 {
5         say $cle , $valeur," "; # e5 a1 d4 c3 b2 ou bien …
6 }
Cet article est issu de Wikibooks. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.