Gestion des fichiers
Ouverture et fermeture d'un ou plusieurs fichiers
open (fic1, "fichier1") ; |
# ouvre fichier1, et lui associe l'identifiant fic1 |
Différents modes d'accès à un fichier
sont envisageables avec Perl :
- mode lecture : cf. ci-dessus ; c'est le mode par
défaut.
- mode écriture : open (fic1, ">fichier1")
;
- mode ajout : open (fic1, ">>fichier1") ;
- mode lecture + écriture : open (fic1,
"+>fichier1") ;
+> permet d'écrire en fin de
fichier. Si on veut écrire en début de fichier,
utiliser <+.
La commande open renvoie une valeur booléenne. La commande est donc utilisable comme condition dans un test pour vérifier que le fichier est bien ouvert.
La fermeture d'un fichier se fait en utilisant son
identifiant, par exemple avec close(fic1).
Lecture d'un fichier
Une fois le fichier dont l'identifiant est fic1 ouvert, on peut en lire
une ligne avec :
$ligne = <fic1> ;
La lecture de la dernière ligne de ce fichier se
fera de la manière suivante :
($derniere_ligne) = reverse <fic1>; |
# les parenthèses sont
nécessaires |
On peut également "envoyer" le contenu de la lecture dans un
tableau :
@tab = <fic1> ; |
# chaque ligne de fic1 devient un
élément de tab |
On peut également lire l'entrée standard avec :
$ligne = <> ;
Ceci permet en outre de lire plusieurs fichiers
séquentiellement, fichiers passés en argument du
programme Perl. Le tableau spécial @ARGV contient les
arguments passés au moment de l'appel du programme. Ainsi,
si on lance prog par prog fic1 fic2,
@ARGV sera le tableau ("fic1", "fic2").
La fonction eof retourne une valeur non
nulle si le dernier fichier d'entrée a
été lu en entier, et 0 sinon.
La substitution des variables scalaires est possible dans <
>. Ainsi,
$fichier = "fic1";
$ligne = <$fichier> ;
est une séquence équivalente à
$ligne = <fic1> ;
On peut en outre utiliser les modèles Unix de listes de noms
de fichiers :
@listefic = <*.pl> ;
permet d'affecter la liste de tous les fichiers .pl à la
variable tableau @listefic.
Sauts dans un fichier
La syntaxe de la commande seek est la
suivante :
seek (varFic,distance,index);
distance représente le nombre d'octets
à sauter. index vaut 0, 1 ou 2 selon
que l'on veuille sauter distance octets par
rapport au début, à la position courante, ou
à la fin du fichier. La position courante est l'emplacement
de la ligne suivante à lire. Ainsi,
seek(monFic,0,2); # permet d'aller à la fin du
fichier (pour y écrire, par ex.)
seek(monFic,-50,1); # revient 50 octets en arrière
La fonction tell retourne la distance en octets entre le début du fichier et la position courante.
Lecture de caractères
La fonction getc permet de lire un seul carctère
d'un fichier d'entrée :
$carac = getc(monFic);
Ecriture dans un fichier
Une fois un fichier ouvert en écriture, on peut y
écrire avec :
print fic1 ("toto\n") ;
Erreurs
Afin de mettre fin à un programme, par exemple en cas
d'ouverture infructueuse d'un fichier, on peut utiliser la commande die,
et diriger les messages (pas forcément d'erreur) vers STDERR
:
open (fic, "/usr/bin/toto") || die ("Unable to open
toto\n");
print STDERR ("File toto opened successfully\n");
Si toto existe, print affiche sur STDERR le message de confirmation d'ouverture, alors que die interrompt le programme et affiche le message d'erreur si l'ouverture de toto s'est révélée impossible (cf. l'opérateur ||, qui désigne le OU logique). On peut également écrire cette première ligne sous la forme plus complexe :
unless (open(fic,"/usr/bin/toto")) {
die ("Unable to open toto\n");
}
Opérateurs de vérification de
fichier
-e fic |
# le fichier existe |
-r fic |
# l'accès en lecture est possible |
-w fic |
# l'accès en écriture est possible |
-x fic |
# l'exécution est possible |
-z fic |
# le fichier existe mais est vide |
-s fic |
# taille du fichier en octets |
Ouverture de canaux
On peut créer un canal entre un fichier de sortie Perl et l'entrée standard d'une autre commande :
open (msg, "| mail titi") ;
print msg ("Coucou") ;
close (msg) ;
Cela enverra un "Coucou" à l'utilisateur titi au
moment du close, ou à la fin du programme si le canal n'est
pas fermé.
Inversement, si l'on veut traiter le fichier ouvert comme une commande
qui redirige des données vers un programme on fait suivre le
nom du fichier d'un pipe :
open (CAT, "cat file*|");
Cette ligne exécute la commande cat file*, dont la
sortie est considérée comme le fichier dont la
variable est CAT.
Manipulation de répertoires
Les commandes sont je pense suffisamment explicites :
mkdir(nomrép, permissions); |
# création de
répertoire (les permissions,comme sous
Unix, sont |
chdir(nomrép); |
# changement de répertoire courant |
opendir(varrép,nomrep); |
# "ouverture" du rép. nomrep auquel on associe la variable varrép |
closedir(varrép); |
# fermeture du rép identifié par varrép |
Une fois un répertoire ouvert, on peut
accéder à n'importe quel fichier de ce
répertoire avec la commande :
readdir(varrép);
Format d'impression
Un format se définit de la manière suivante :
format MONFORMAT =
=======
COUCOU
=======
.
La dernière ligne contenant le point ne doit pas
être oubliée, c'est elle qui indique la fin de
spécification du format.
Lorsque l'on veut afficher un résultat en utilisant un
format, il faut au préalable affecter le nom du format
à la variable système $~, puis appeler la
fonction write :
$~ = "monformat";
write ;
format monformat =
--------
BEUARHHH
--------
.
On peut évidemment indiquer des champs valeurs dans les définitions de formats :
#!/bin/perl
$a = 2;
$b = 3;
$~ = "form";
write;
format form =
========
Nous avons mangé @ bananes et @ pommes.
$a, $b
========
.
permet d'afficher :
========
Nous avons mangé 2 bananes et 3 pommes.
========
Les formats de champ valeur disponibles sont :
@<<< justifié à gauche
@>>> justifié à droite
@||| centré
@##.## format numérique à virgule fixe
@* texte multiligne
Le nombre de <, >, | ou # spécifie le nombre de caractères à afficher à la place du champ valeur. Si le caractère @ est spécifié seul, comme dans l'exemple précédent, le texte n'est pas mis en forme. Le caractère @ lui-même est compris dans le comptage du nombre de caractères du champ valeur. Ainsi, le champ @###.## a une longueur de sept caractères : quatre avant la virgule, et deux après.
Le champ multiligne @* permet de reconnaître les caractères de nouvelle ligne et de traiter l'affichage en conséquence.
La fonction write peut être redirigée vers un autre fichier que la sortie standard avec la séquence de commandes :
select (monFichier);
$~ = "monFormat";
write ;
Le format et le fichier sont associés dans le sens où chaque variable de fichier possède son propre format d'impression.
La commande $ancFic = select(nouvFich) permet de définir nouvFich comme variable de fichier courante tout en affectant le nom de l'ancien fichier à la variable $ancFic, que l'on peut ensuite réutiliser avec select($ancFic).
printf
La commande printf peut être utilisée en Perl comme en C. Les spécificateurs de champ sont les suivants :
%c caractère simple
%d entier en base 10
%e nombre à virgule flottante en notation scientifique
%f nombre à virgule flottante en notation normale (virgule
fixe)
%g nombre à virgule flottante en format compact
%s chaîne de caractères
%u entier non signé
La commande printf ("J'ai mangé %d bananes.\n",$nb) permet par exemple d'afficher le nombre $nb de bananes ingurgitées.
Un entier positif après le caractère %
indique la largeur de champ minimale. Ainsi, %20s imprime une
chaîne (justifiée à droite,à
moins de rajouter un - devant la largeur du champ) dans un champ de 20
caractères.