mercredi 18 février 2009

Lecture un fichier séquentiel avec Perl

En Perl, c'est fréquent d'avoir à manipuler des fichiers textes. Une des premières choses à apprendre est l'ouverture d'un fichier et sa lecture séquentielle, c'est-à-dire ligne par ligne. Comme il y a plusieurs façons de faire, en voici trois variantes.

1. Boucle while
open(FILE_HANDLE_1, 'lyrics.lrc') ||
die ('Ouverture du fichier impossible');

while ($one_line = <FILE_HANDLE_1>) {
chomp($one_line);

if ($one_line ne '') {
# do something...
push(@lines, $one_line);
}
}

close(FILE_HANDLE_1);
Notions à retenir :
  • FILE_HANDLE_1 représente le nom donné à un file handler qui permet la manipulation d'un fichier. On pourra se référer à ce nom par la suite.
  • À l'ouverture du fichier, si la commande échoue, on utilisera l'opérateur || pour indiquer l'instruction alternative à exécuter.
  • Effectuer une boucle pour chaque ligne trouvée dans le fichier.
  • La fonction chomp() permet de supprimer le saut de ligne à la fin de la chaîne de caractère.
  • L'opérateur "ne" (not equal) est utilisé pour comparer des chaînes de caractères. On s'assure ici que la ligne n'est pas vide.
  • On peut ensuite ajouter à l'array @lines chaque ligne lue.
  • On termine en fermant le fichier.
2. Boucle foreach avec $_

On peut aussi utiliser un raccourci en attribuant automatiquement le file handler à une variable de type array, où chaque ligne deviendra un élément de la liste. L'objectif est atteint grâce aux deux lignes suivantes :
open(FILE_HANDLE_2, 'lyrics.lrc') ||
die ('Ouverture du fichier impossible');
@lines = <FILE_HANDLE_2>;
Par contre, si on veut effectuer un traitement sur les lignes, on devra procéder à une itération sur chaque élément de la liste.
foreach (@lines) {
# ici, chaque ligne dans @lines se termine
# par un saut de ligne

# $_ est la valeur courante de l'itération
# dans la boucle
chomp($_);
if ($_ ne '') {
print $_ . "\n";
}
}
Commentaires sur le code :
  • En Perl, la variable $_ représente l'input par défaut lorsque la variable n'est pas explicitement déclarée (voir troisième exemple).
  • Le symbole # permet de mettre une ligne en commentaire.
3. Boucle foreach avec variable nommée

Dans une boucle foreach, si on préfère nommer la variable explicitement plutôt que d'utiliser $_, on peut le faire comme ceci :
foreach $one_line (@lines) {

# à la place de :

foreach (@lines) {
C'est aussi simple que ça.

Justement, j'en profite pour faire un retour sur ce que j'écrivais hier concernant les ressemblances entre PHP et Perl. Ce dernier a transmis en héritage deux autres points que je n'avais pas mentionné :
  • L'opérateur de concaténation est le point .
  • La fonction die() pour lancer un message d'exception et terminer le programme

Aucun commentaire:

Publier un commentaire