Initiation au Perl
9. Les entées - sorties
Perl contient deux commandes essentielles au niveau des fichiers, soit
l'ouverture (open) et la fermeture (close). A celles-ci s'ajoutent les opérations
de test, de lecture et d'écriture.
Comme nous l'avons vu dans les exemples précédents, par défaut Perl lit et écrit
sur les entées - sorties standard. Il est bien sur possible de rediriger
9.1 Manipulation de fichiers
Lorsque l'on veut lire ou écrire dans un fichier, il faut le dire au programme.
Pour cela il faut dans un premier temps ouvrir le fichier, lire ou écrire, puis le fermer.
Pour lire un fichier on utilise la commande Open :
Ouvre un fichier en lecture uniquement
syntaxe : open ( descripteur,"<nom_fichier");
Ouvre un fichier en lecture et en écriture
syntaxe : open ( descripteur,"+<nom_fichier");
Ouvre un fichier en écriture avec écrasement en cas d'existence préalable du fichier
syntaxe : open ( descripteur,">nom_fichier");
Ouvre un fichier en écriture pour ajout en fin de fichier
syntaxe : open ( descripteur,">>nom_fichier");
Ouvre un fichier en lecture et écriture avec écrasement en cas d'existence préalable du fichier
syntaxe : open ( descripteur,"+>nom_fichier");
Le descripteur (ou handle) permet de spécifier sur quel entrée / sortie on agit.
Pour lire ou écrire le fichier on utilise les commandes suivantes :
Ecrit dans un fichier ouvert
syntaxe : print descripteur "ce qu'il y a à ajouter";
Lit ligne par ligne dans un fichier
syntaxe : $ligne = < descripteur >;
Lit et stocke chaque ligne dans le tableau fichier
syntaxe : @fichier = < descripteur >;
Une fois les opérations voulues effectuées ont ferme le fichier :
ferme un fichier
syntaxe : close (descripteur);
Par défaut il existe 3 les descripteurs ouvert à l'exécution du programme
<STDIN> : Descripteur d'entrée, Entrée standard en lecture seul.
<STDOUT>: Descripteur de sortie. Sortie standard en écriture seul.
<STDERR>: Descripteur des messages d'erreurs. Sortie d'erreurs standard en écriture seul.
Lorsque l'on utilise la commande print STDOUT "essais\n"; est
équivalent à print "essais\n" si l'on n'a pas sélectionné une autre sortie par défaut.
La commande select(descripteur); permet de spécifier une autre sortie
par défaut. La commande print "essais\n"; affectera donc le nouveau descripteur.
La commande Open et Close renvoie en 1 ou 0 en cas de succès ou d'échec, on utilise
donc cette propriété pour vérifier qu'il n'y ai pas d'erreur à l'ouverture grâce
à la syntaxe suivante :
open(FILE,"$fichier") || die "Erreur de lecture $fichier, Erreur: $!";
# Affiche le message et sort du programme en cas d'erreur.
Exemple :
open(FILE,"<$nom_fichier") || die "Erreur de lecture $nom_fichier, Erreur: $!";
@fichier = <FILE>;
close(FILE);
@result = sort @fichier;
open(FILE,">$nouveau_fichier") || die "Erreur d'écriture de $nouveau_fichier, Erreur: $!";
print FILE @result;
close(FILE);
9.2 Les accès au système de fichiers
Perl offre la possibilité de réaliser un certain nombre d'opérations sur
les fichiers et répertoires du disque sans passer par un shell quelconque (utilisation
de la commande system ou exec).
Efface un ou plusieurs fichiers
syntaxe : unlink (liste des noms de fichiers);
Renomme ou déplace un fichier
syntaxe : rename(ancien nom du fichier, nouveau nom du fichier)
Crée un lien symbolique (Unix seulement, ln -s)
syntaxe : symlink(nom du fichier, nom du lien)
Change de répertoire courant
syntaxe : chdir(nom du répertoire)
Crée un nouveau répertoire
syntaxe : mkdir(nom, mode)
# mode sont les permissions (Unix) à attribuer au répertoire.
Efface un répertoire
syntaxe : rmdir(nom)
9.3 Testes sur les fichiers
Il existe un certain nombre d'opérateur de test sur les fichiers dont
voici quelques uns :
-e Le fichier existe
-r Le fichier est lisible (permission r)
-x Le fichier est exécutable (permission x)
-w Le fichier est accessible en écriture (permission w)
-d Le répertoire existe
-T Le fichier est de type texte
-B Le fichier est binaire
-f Fichier texte existant et non vide
-l Le lien symbolique existe (Unix)
-t Terminal
-s Le fichier n'est pas de taille nulle
-z Le fichier est de taille nulle (! -s)
Exemple :
if (! -e "$NomFichier") {
print "Le fichier n'existe pas...\n";
exit; # Sort du programme.
}
9.4 Appels systèmes
Perl permet de faire appel à une commande du système. Pour cela il existe plusieurs solutions :
system "nom_de_la commande";
open(descripteur, "nom_de_la commande|"); ....; close(descripteur);
# Exécute la commande et récupère la sortie standard dans le descripteur
Exemple :
system "rm nomfichier"; sous UNIX
system "del monfichier"; sous DOS
9.5 Formatage de la sortie
9.5.1 Utilisation de printf
Il est possible de formater la sortie en utilisant printf format, valeurs
Exemple:
printf "%6s %3d %4.2f\n",$s,$d,$f;
%6s sortie caractère sur 6 caractères
%3d sortie d'un entier sur 3 caractères
%4.2f sortie d'un réel sur 4 caractères dont 2 après la virgule
9.5.2 Utilisation de write
Mais il aussi possible prédéfinir des formats. Pour définir un format vous devez utiliser le mot clé format et le définir
puis afficher vos résultats au moyen de la commande write.
- Description d'un format :
format nom_du_format =
descriptif de la sortie
.
nom_du_format :
2 types de nom sont possibles, pour l'entête et pour le corps de l'affichage. (NOM_TOP et NOM)
N'oubliez pas le caractère . (point) qui termine la définition d'un
format. Ce point doit être en première colonne dans votre fichier.
Ne pas mettre de commentaires comme ici dans la définition
d'un format ceux-ci seraient affichés lors de l'affichage.
descriptif de la sortie :
Ce descriptif comprend 2 parties essentielles :
1. le format d'affichage
Cette partie permet de connaître la façon dont vont être
affichées les données (l'endroit, la manière, la taille ...)
La taille est définie par le nombre de signes présents après le signe @ ou ^
@>>>> indiquera que la valeur sera affichée sur 4 caractères justifiés à droite
@<<<< même chose mais justifié à gauche
@|||| même chose mais centré
@###.## champ numérique avec 2 chiffres après la virgule
@* champ multiligne, on ne s'occupe pas de la taille du champ à afficher
^>>> affichera un champ sur plusieurs lignes de 3 caractères lignes vides incluses
~ ^>>> même chose mais sans les lignes vides
~~ ^>>> même chose mais répétera l'affichage jusqu'à trouver une ligne vide
2. les variables à afficher
$variables1,$variables2, ....
- Affichage à l'écran :
Le nom du format sera STDOUT qui par défaut est la sortie standard.
STDOUT_TOP sera le nom du format pour l'entête.
- Affichage dans un fichier :
Le nom du format sera le nom du descripteur du fichier (par exemple DESC).
DESC_TOP sera le nom du format pour l'entête.
- Quelques exemples :
* On désire écrire les noms et prénoms des personnes contenus dans un tableau
associatif par colonnes avec comme entête les mots Nom Prénom et ceci à l'écran.
format STDOUT_TOP = # Permet d'écrire la première ligne
Nom Prénom # La première ligne
.
format STDOUT = # Permet d'écrire les données formatées
@>>>>>>>> @>>>>>>>> # Format d'affichage des 2 champs justifié à droite
$nom, %tab{$nom} # le nom sur 8 caractères et le prénom sur 10
.
foreach $nom (keys %tab) {
$prenom = @tab{$nom};
write;
}
|