Historique de la question :
La boucle while est l'une des structures de contrôle fondamentales de Perl, utilisée depuis le début pour traiter des données, lire des fichiers et itérer sur des collections. Elle est étroitement intégrée avec la variable spéciale $_, qui, par défaut, prend des valeurs lors de la lecture de lignes à partir d'un fichier ou d'autres itérations.
Problème :
Une mauvaise utilisation de la variable $_, la lecture de fichiers sans descripteurs explicites et un achèvement incorrect des boucles entraînent des erreurs dans le traitement des lignes et la perte de données. Le traitement automatique par défaut utilisant $_ augmente la flexibilité, mais nécessite de l'attention lors de l'écriture du code, surtout en ce qui concerne les imbrications et les modifications de la chaîne à l'intérieur de la boucle.
Solution :
Pour lire des fichiers, on utilise souvent l'expression
while (<FILEHANDLE>) { # ... }
ou même simplement while (<>) pour lire depuis le flux d'entrée ou la liste des fichiers passés au script. À l'intérieur de cette boucle, Perl place automatiquement la ligne lue dans $_, ce qui permet une utilisation concise des expressions régulières, des remplacements et d'autres opérations. Si une variable doit être désignée explicitement, on utilise la construction while (my $line = <FILEHANDLE>).
Exemple de code :
open my $fh, '<', 'file.txt' or die $!; while (<$fh>) { chomp; # fonctionne avec $_ print "Ligne : $_ "; } close $fh;
Caractéristiques clés :
Que se passe-t-il si dans la boucle while vous modifiez $_ ?
Modifier $_ à l'intérieur de la boucle n'affecte pas le fichier lu lui-même, mais uniquement la valeur de la variable dans le cadre d'une seule itération. Cependant, réutiliser $_ peut prêter à confusion si plusieurs sources de données sont manipulées simultanément.
Que se passe-t-il si on utilise while (<>) sans avoir ouvert le fichier au préalable ?
L'opérateur <> sans ouverture explicite de fichier lit soit depuis STDIN, soit depuis des fichiers spécifiés dans @ARGV lors de l'exécution du script. Si rien n'est spécifié, il attend une entrée depuis le clavier.
Est-il obligatoire d'utiliser chomp à l'intérieur de while pour supprimer \n ?
Non, ce n'est pas obligatoire, mais sans chomp, chaque ligne contiendra un caractère de nouvelle ligne \n. Cela entraîne souvent des résultats inattendus (par exemple, des sauts de ligne doubles lors de l'impression).
** Cas négatif
Dans un script analysant des journaux, on a oublié d'ajouter chomp à l'intérieur de while (<FILE>), ce qui a entraîné des retours à la ligne supplémentaires lors de l'affichage dans la console.
Avantages :
Inconvénients :
** Cas positif
Le développeur utilise toujours une déclaration claire des variables via my $line = <$fh> et chomp immédiatement après la lecture de la ligne.
Avantages :
Inconvénients :