Outils pour utilisateurs

Outils du site


perl:boucles_for_foreach_while

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
perl:boucles_for_foreach_while [2009/03/15 00:44] – créée rootperl:boucles_for_foreach_while [2013/03/12 23:27] (Version actuelle) root
Ligne 1: Ligne 1:
-== 1. For ==+====== Les boucles ====== 
 + 
 +====== 1. For ======
  
 On retrouve la forme traditionnelle du C, qui se présente exactement de la même façon : On retrouve la forme traditionnelle du C, qui se présente exactement de la même façon :
- for (my $i = 0; $i < 10; $i++) { +<code perl> 
-   print "$i\n"; +  for (my $i = 0; $i < 10; $i++) { 
- }+  print "$i\n"; 
 +  } 
 +</code>
  
 L'instruction attend trois éléments : L'instruction attend trois éléments :
-* L'initialisation, exécutée une seul fois avant de démarrer l'itération. On peut en particulier déclarer des variables locales à la boucle; +  * L'initialisation, exécutée une seul fois avant de démarrer l'itération. On peut en particulier déclarer des variables locales à la boucle; 
-* Le test d'itération, qui est évalué avant chaque itération (donc avant même la première) pour savoir si elle doit être exécutée ou la boucle doit être quittée; +  * Le test d'itération, qui est évalué avant chaque itération (donc avant même la première) pour savoir si elle doit être exécutée ou la boucle doit être quittée; 
-* Une instruction qui est exécutée inconditionnellement à la fin de chaque itération complète+  * Une instruction qui est exécutée inconditionnellement à la fin de chaque itération complète
  
 Il est possible d'omettre certaines instructions, par exemple : Il est possible d'omettre certaines instructions, par exemple :
- my $i = 0; +<code perl> 
- for (; $i<10; ) { $i++; } +  my $i = 0; 
- for (;;) { # boucle infinie } +  for (; $i<10; ) { $i++; } 
 +  for (;;) { # boucle infinie } 
 +</code>
 On peut également contrôler l'exécution de la boucle pendant l'itération, à l'aide de 3 mots-clés : On peut également contrôler l'exécution de la boucle pendant l'itération, à l'aide de 3 mots-clés :
-'''last''' : quitte immédiatement la boucle courante +  * **last** : quitte immédiatement la boucle courante 
-'''next''' : saute à la fin de l'itération et continue la boucle courante +  * **next** : saute à la fin de l'itération et continue la boucle courante 
-'''redo''' : reprend l'itération au début comme si elle n'avait pas eu lieu (la condition n'est dons pas ré-évaluée)+  * **redo** : reprend l'itération au début comme si elle n'avait pas eu lieu (la condition n'est dons pas ré-évaluée)
  
 Ces mot-clés s'adressent implicitement à la boucle qui contrôlent le bloc où ils sont invoqués. Exemple : Ces mot-clés s'adressent implicitement à la boucle qui contrôlent le bloc où ils sont invoqués. Exemple :
- my ($x, $y); +<code perl> 
- for ($x = 0; $x < 80; $x++) { +  my ($x, $y); 
-   for ($y = 0; $y < 60; $y++) { +  for ($x = 0; $x < 80; $x++) { 
-     last if ($x * $y < 500); # Termine la boucle for ($y...) +  for ($y = 0; $y < 60; $y++) { 
-   +  last if ($x * $y < 500); # Termine la boucle for ($y...) 
-   last if ($x * $x < 900); # Termine la boucle for ($x...) +  
- }+  last if ($x * $x < 900); # Termine la boucle for ($x...) 
 +  } 
 +</code>
  
 Il est possible toutefois de nommer les boucles, et donc de préciser explicitement quelles boucles on veut arrêter, sauter ou redémarrer : Il est possible toutefois de nommer les boucles, et donc de préciser explicitement quelles boucles on veut arrêter, sauter ou redémarrer :
- BOUCLE_X: for (my $x = 0; $x < 80; $x++) { +<code perl> 
-   BOUCLE_Y: for (my $y = 0; $y < 60; $y++) { +  BOUCLE_X: for (my $x = 0; $x < 80; $x++) { 
-     last BOUCLE_Y if ($x * $y < 500); # Termine la boucle for ($y...) +  BOUCLE_Y: for (my $y = 0; $y < 60; $y++) { 
-   +  last BOUCLE_Y if ($x * $y < 500); # Termine la boucle for ($y...) 
-   last BOUCLE_X if ($x * $x < 900); # Termine la boucle for ($x...) +  
- }+  last BOUCLE_X if ($x * $x < 900); # Termine la boucle for ($x...) 
 +  } 
 +</code>
  
 Cette forme ayant l'avantage de ne pas être sensible à l'imbrication de nouveaux blocs de code, et éventuellement plus lisible et plus sûre si les boucles sont longues et compliquées. C'est également le meilleur moyen de quitter plusieurs boucles imbriquées de façon simple (il existe aussi le goto, déconseillé). Cette forme ayant l'avantage de ne pas être sensible à l'imbrication de nouveaux blocs de code, et éventuellement plus lisible et plus sûre si les boucles sont longues et compliquées. C'est également le meilleur moyen de quitter plusieurs boucles imbriquées de façon simple (il existe aussi le goto, déconseillé).
  
-== 2. Foreach ==+====== 2. Foreach ======
  
 Pour itérer sur une liste, il existe une instruction simple, lisible et rapide : Pour itérer sur une liste, il existe une instruction simple, lisible et rapide :
- my @courses = ("pain", "beurre", "café"); +<code perl> 
- foreach my $produit (@courses) { +  my @courses = ("pain", "beurre", "café"); 
-   print "Acheter du $produit\n"; +  foreach my $produit (@courses) { 
- }+  print "Acheter du $produit\n"; 
 +  } 
 +</code>
  
 Il est possible d'omettre l'itérateur (la variable qui reçoit l'élément suivant de la liste à chaque itération), dans ce cas il s'appelle implicitement $_ : Il est possible d'omettre l'itérateur (la variable qui reçoit l'élément suivant de la liste à chaque itération), dans ce cas il s'appelle implicitement $_ :
- foreach (@courses) { +<code perl> 
-   print "Acheter du $_\n"; +  foreach (@courses) { 
- }+  print "Acheter du $_\n"; 
 +  } 
 +</code>
  
 Enfin, on a le droit d'inverser la syntaxe: on peut alors mettre une instruction (et non un bloc) en tête puis le foreach après. Ceci peut être plus lisible pour les boucles simples, et mime parfois le langage naturel : Enfin, on a le droit d'inverser la syntaxe: on peut alors mettre une instruction (et non un bloc) en tête puis le foreach après. Ceci peut être plus lisible pour les boucles simples, et mime parfois le langage naturel :
- print "Acheter du $_\n" foreach (@courses); # Notez l'absence de bloc "{}"+<code perl> 
 +  print "Acheter du $_\n" foreach (@courses); # Notez l'absence de bloc "{}" 
 +</code>
  
 L'argument passé à foreach n'est autre qu'une déclaration de liste, il est donc possible d'écrire : L'argument passé à foreach n'est autre qu'une déclaration de liste, il est donc possible d'écrire :
- print "Acheter du $_\n" foreach ("pain", "beurre", "café"); +<code perl> 
- for (0..9) { print "$i\n"; } # Un programmeur écrit les compteurs entiers ainsi !+  print "Acheter du $_\n" foreach ("pain", "beurre", "café"); 
 +  for (0..9) { print "$i\n"; } # Un programmeur écrit les compteurs entiers ainsi ! 
 +</code>
  
 On retrouve exactement les mêmes mécanismes de nommage de boucle et de contrôle avec les mots-clés last, next et redo. On retrouve exactement les mêmes mécanismes de nommage de boucle et de contrôle avec les mots-clés last, next et redo.
  
-'''Note''': on peut utiliser simplement ''for'' à la place de ''foreach'' (Perl distinguant les cas d'utilisation suivant qu'une liste ou un triplet d'instructions est passé), mais pour la lisibilité on utilise toujours ''foreach'' pour itérer sur les listes. +**Note**: on peut utiliser simplement //for// à la place de //foreach// (Perl distinguant les cas d'utilisation suivant qu'une liste ou un triplet d'instructions est passé), mais pour la lisibilité on utilise toujours //foreach// pour itérer sur les listes.
- +
-== 3. While/until ==+
  
-On retrouve encore une construction qui vient du C, la boucle ''while''+====== 3. While/until ======
- my $i 0; +
- while ($i < 5) { +
-   $i++; +
- }+
  
-Perl définit aussi son homonyme ''until'' où la condition est simplement inversée +On retrouve encore une construction qui vient du C, la boucle //while// 
- my $i = 0; +<code perl> 
- until ($i >= 5) { +  my $i = 0; 
-   $i++; +  while ($i 5) { 
- }+  $i++; 
 +  } 
 +</code>
  
-On peut également utiliser les mots-clés ''next'', ''last'' et ''redo''. De même que pour ''for'' et ''foreach'', on peut nommer les boucles pour être plus explicite dans leur usage. Il existe même une forme qui permet de reproduire le 3ème élément d'un ''for'', c'est-à-dire une expression qui est toujours évaluée en fin d'itération (qu'elle ait été forcée par un ''next'' ou non +Perl définit aussi son homonyme //until// où la condition est simplement inversée 
- my $i = 0; +<code perl> 
- COMPTEUR: while ($i <10) { +  my $i = 0; 
-   next COMPTEUR if ($i % 2) == 0; +  until ($i >5) { 
-   print $i; # N'affiche que les nombres impairs entre 0 et 10 +  $i++; 
- } continue { +  } 
-   $i++; +</code>
- }+
  
-Enfinil est possible d'évaluer le test en fin d'itérationce qui veut dire qu'on aura toujours au moins une itération qui aura lieu, avec le classique ''do ... while''. Mais attentionil s'agit d'une construction qui ne fait pas partie du langage et a ses limitations (notamment on ne peut ni les nommer, ni utiliser les mots-clés ''next'', ''last'' et ''redo''+On peut également utiliser les mots-clés //next////last// et //redo//. De même que pour //for// et //foreach//, on peut nommer les boucles pour être plus explicite dans leur usage. Il existe même une forme qui permet de reproduire le 3ème élément d'un //for//c'est-à-dire une expression qui est toujours évaluée en fin d'itération (qu'elle ait été forcée par un //next// ou non 
- my $i; +<code perl> 
- do +  my $i = 0
-   $i++; +  COMPTEUR: while ($i <= 10) 
- while ($i 5);+  next COMPTEUR if ($i % 2) ====== 0; 
 +  print $i; # N'affiche que les nombres impairs entre 0 et 10 
 +  } continue { 
 +  $i++; 
 +  } 
 +</code>
  
 +Enfin, il est possible d'évaluer le test en fin d'itération, ce qui veut dire qu'on aura toujours au moins une itération qui aura lieu, avec le classique //do ... while//. Mais attention, il s'agit d'une construction qui ne fait pas partie du langage et a ses limitations (notamment on ne peut ni les nommer, ni utiliser les mots-clés //next//, //last// et //redo//) :
 +<code perl>
 +  my $i;
 +  do {
 +  $i++;
 +  } while ($i < 5);
 +  </code>
perl/boucles_for_foreach_while.1237077847.txt.gz · Dernière modification : 2009/03/15 00:44 de root