SELFHTML/Quickbar
CGI/Perl
Éléments de langage Perl
![]() |
Lire et écrire des fichiers |
![]() |
|
![]() |
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.
#!/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"; |
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é.
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.
![]() ![]() |
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.
#!/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 $_; } } |
#!/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"; } |
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 "".
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.
![]() ![]() |
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.
#!/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 |
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:![]() |
![]() |
avant:![]() |
![]() |
SELFHTML/Quickbar
CGI/Perl
Éléments de langage Perl
Serge François, 13405@free.fr