SELFHTML/Quickbar  CGI/Perl  Éléments de langage Perl


Lire et écrire des fichiers

Cette page est un document avec du texte et des informations

 Ouvrir des fichiers et les fermer
 Lire des fichiers
 Écrire des données dans des fichiers

 

Ouvrir des fichiers et les fermer

Avec des scripts Perl, vous pouvez gérer des fichiers. En relation avec les scripts CGI, les scripts Perl peuvent lire et écrire des fichiers sur l'ordinateur serveur. Ce n'est qu'ainsi que des applications CGI aussi connues que des compteurs d'accès ou des livres d'hôtes sont possibles.

Chaque fichier que vous voulez lire avec un script Perl, ou dans lequel vous voulez écrire des données, doit d'abord être ouvert. Après avoir lu un fichier ou écrit tous les contenus désirés dans le fichier, vous devez toujours refermer le fichier.

Exemples:

#!/usr/bin/perl

open(FICHIERNOUVELLES, "<news.txt");    # ouvrir un fichier pour la lecture
close(FICHIERNOUVELLES);

open(FICHIERNOUVELLES, ">news.txt");    # ouvrir un fichier pour l'écriture
close(FICHIERNOUVELLES);

open(FICHIERNOUVELLES, ">>news.txt");    # ouvrir un fichier pour y ajouter des données
close(FICHIERNOUVELLES);

if(open(FICHIERCOMPTEUR, "<counter/counter.dat") == false)
 { print "FICHIERCOMPTEUR non trouvé\n"; }

open(FICHIERCOMPTEUR, "<counter/counter.dat") || die "FICHIERCOMPTEUR non trouvé\n";

Explication:

Un fichier s'ouvre avec la fonction Perl open. La fonction attend deux paramètres.

Comme premier paramètre donnez un gestionnaire de fichier. C'est un nom qui est nécessaire pour pouvoir accéder au fichier. Vous avez toute liberté pour l'attribution du nom de gestionnaire de fichier. Il est habituel et de bon ton de n'utiliser pour de tels noms que des majuscules. Dans les exemples ci-dessus FICHIERNOUVELLES et FICHIERCOMPTEUR sont de tels noms.

Comme deuxième paramètre, la fonction open attend la mention d'un nom de fichier. Si le fichier désiré se trouve dans un autre répertoire, utilisez le même schéma d'adressage que pour les  liens HTML à des fichiers d' autres répertoires. L'important est de noter une barre oblique normale pour séparer les répertoires même si vous faites tourner le script Perl dans un environnement DOS/Windows.

Devant le nom de fichier et le cas échéant la mention du chemin, notez encore à l'aide de caractères spéciaux en quel mode vous désirez ouvrir le fichier:

<fichier.dat signifie: ouvrir le fichier fichier.dat pour la lecture uniquement. Le fichier doit exister sinon il y a une erreur.
>fichier.dat signifie: ouvrir le fichier fichier.dat pour l'écriture de données. Si le fichier existe déjà, son contenu précédent est écrasé. Si le fichier n'existe pas encore, il est créé automatiquement.
>>fichier.dat signifie: ouvrir le fichier fichier.dat pour l'écriture de données. Si le fichier existe déjà, le nouveau contenu est ajouté à l'ancien, c'est à dire que le vieux contenu n'est pas effacé. Si le fichier n'existe pas encore, il est créé automatiquement.
+>fichier.dat signifie: ouvrir le fichier fichier.dat pour la lecture et l'écriture de données.
|cherche.exe signifie: Le fichier cherche.exe est un programme exécutable. Le programme est ouvert pour être exécuté.

Attention:

Un bon style de programmation capture les erreurs possibles lors de l'ouverture de fichiers et prévoit une réaction appropriée dans le script Perl. Les deux derniers des exemples ci-dessus montrent des constructions d'instructions pour de telles réactions à des erreurs. La première des deux constructions d'instructions travaille avec une  instruction conditionnelle et donne à l'aide de la fonction print un message d'erreur en cas d'échec de l'ouverture du fichier. La deuxième construction d'instruction est une simple expression "ou" évaluée par l'interpréteur Perl. Dans un premier temps, la première partie de l'expression (avant le signe ou ||) est évaluée. C'est la commande d'ouverture de fichier. Si l'ouverture du fichier réussit, la fonction open renvoie la valeur "vrai", et ainsi c'est aussi toute l'expression logique qui est vraie. Si l'ouverture du fichier ne réussit pas, la deuxième partie de l'expression est évaluée. Là le script est simplement terminé prématurément à l'aide de la fonction die. La fonction die (= mourir) termine un script Perl et sort si désiré un texte comme dans l'exemple ci-dessus.

 

Lire des fichiers

Il y a différentes façons de lire un fichier. Quelle possibilité vous choisissez, dépend de la mission que doit remplir le script Perl. La condition préalable pour lire un fichier est que ce fichier ait été ouvert avant.

Exemple 1 (lire un fichier ligne par ligne):

#!/usr/bin/perl

@lignes = ("");
open(MAILDAT, "<inbox.dat") || die "fichier avec E-Mails non trouvé\n";
while(<MAILDAT>)
 {
  push(@lignes,$_);
 }
close(MAILDAT);
for(@lignes)
 {
  if(/HTML/)
   {
    print $_;
   }
  }

Exemple 2 (lire un fichier signe par signe):

#!/usr/bin/perl

@voyelle = ("a","e","i","o","u");
@nombre = (0,0,0,0,0);
open(FICHIER, "<$ARGV[0]") || die "$_[1] non touvé\n";
while(($signeactuel = getc(FICHIER)) ne "")
 {
  for($i=0;$i<=4;++$i)
   {
    if($signeactuel eq $voyelle[$i])
     {
      $nombre[$i]++;
     }
   }
 }
close(FICHIER);
for($i=0;$i<=4;++$i)
 {
  print "$voyelle[$i] apparaît dans  $ARGV[0] isg. $nombre[$i] fois\n";
 }

Explication:

La forme et la manière la plus courante de lire un fichier en Perl est la lecture ligne par ligne, telle qu'elle est dans l'exemple 1. Cela fonctionne pour tous les fichiers que l'on peut aussi bien lire dans un éditeur de texte, donc tous les genres de fichiers texte, de fichiers de configuration, ou de fichiers de données construits ligne par ligne avec des délimiteurs de champs. Pour cela, il n'existe aucune commande particulière en Perl. Vous notez simplement une  boucle while avec la syntaxe while(<GESTIONFICHIER>), GESTIONFICHIER étant le nom que vous avez attribué avec open. Dans la boucle, vous pouvez adresser la ligne du fichier actuelle lue par la variable prédéfinie $_. Afin de maintenir les données en mémoire de travail pour traitement ultérieur, vous pouvez par exemple lire les lignes dans une  liste, comme dans l'exemple 1 ci-dessus.

Les fichiers binaires - donc, par exemple, des fichiers avec des formats de fichiers spécifiques à certains programmes d'application, qui contiennent aussi des valeurs numériques et des caractères de contrôle - sont plus faciles à lire signe par signe, comme dans l'exemple 2 ci-dessus. La fonction Perl pour lire respectivement le caractère suivant d'un fichier s'appelle getc. Cette fonction renvoie chaque caractère lu que vous pouvez sauvegarder dans une variable appropriée. Quand la fin de fichier a été atteinte, la fonction renvoie un signe vide (hexadécimal 0). C'est pourquoi la condition d'interruption dans l'exemple 2 ci dessus a été formulée dans la boucle while pour la lecture du fichier avec l'  opérateur de comparaison : ne "".

Attention:

L'exemple 2 ci-dessus montre en outre comment vous pouvez lire dans un script Perl un fichier qui n'est pas connu du script mais lui a été transmis comme paramètre lors de son appel: les arguments transmis au script sont sauvegardés dans la  liste prédéfinie @ARGV.

 

Écrire des données dans des fichiers

Selon le mode dans lequel vous avez ouvert un fichier pour l'écriture (voyez  ouvrir des fichiers), un fichier déjà existant sera écrasé lors de l'écriture des données ou bien les nouvelles données seront ajoutées à la fin du fichier.

Exemple:

#!/usr/bin/perl
# Cet exemple lit un fichier adresses délimité par des virgules
# et les écrit formatées  HTML dans un nouveau fichier

@adresses = ("");         # Sauvegarde pour tous les enregistrements
@enregistrement = ("");   # sauvegarde pour tous les champs de l'enregistrement actuel
$champs = "";        # sauvegarde pour les noms des champs (se trouvent dans la première ligne du fichier
$i = 0;
open(ADRESSES, "<adresses.csv") || die "fichier d'adresses non trouvé\n";
while(<ADRESSES>)              # lire le fichier délimité par des virgules
 {
  if($i == 0)                  # lire la première ligne du fichier
   {
    $champs = $_;              # trouver les noms de champs
   }
  else
   {
    $adresses[$i] = $_;        # lire dans @adresses à partir de la deuxième ligne
   }
  $i++;                        # incrémenter le compteur d'enregistrements
 }
close(ADRESSES);
$nombre = $i - 1;              # noter le nombre d'enregistrements
chop($champs);
@champdonnee = split(/,/,$champs);    # reporter dans la première ligne les noms de champs

open(ADRESSESDAT, ">adresses.htm");   # ouvrir le fichier HTML pour l'écriture
print ADRESSESDAT "<html>\n<head>\n";  # écrire le fichier HTML
print ADRESSESDAT "<title>Adresses</title>\n";
print ADRESSESDAT "</head>\n<body bgcolor=#FFFFFF>\n";
for(@adresses)                        # aussi longtemps qu'il y a des données dans la liste d'adresses
 {
  @enregistrement = split(/,/,$_);         # reporter l'enregistrement actuel
  $i = 0;
  for(@enregistrement)
   {
    print ADRESSESDAT "<b>$champdonnee[$i]:</b> $enregistrement[$i]<br>\n";   # écrire l'enregistrement actuel
    $i++;
   }
 }
print ADRESSESDAT "</body>\n</html>\n";
close(ADRESSESDAT);
print $nombre," enregistrement écrits\n";   # seulement pour le contrôle: sur la sortie standard

Explication:

Pour écrire des données dans des fichiers, Perl utilise normalement la fonction print. Cependant, à la différence des sorties sur la sortie standard, il faut, lors de l'écriture dans un fichier, faire suivre print du nom du gestionnaire de fichier attribué lors de l'ouverture du fichier. Vers la fin de l'exemple ci-dessus est ouvert le fichier adresses.htm en mode d'écriture. Il reçoit en tant que gestionnaire de fichier le nom ADRESSESDAT. Avec print ADRESSESDAT "Données...", les données sont écrites dans le fichier adresses.htm.

après: Manipuler des chaînes de caractères et des listes
avant: Sous-programmes et fonctions Perl
 

SELFHTML/Quickbar  CGI/Perl  Éléments de langage Perl

© 1998 Stefan Münz / © 2001 Traduction  Serge François, 13405@free.fr