next up previous contents
Next: Boucles et conditions Up: Introduction à PERL Previous: Récupérer les variables du

Les entrées sorties

Dans le monde Unix, tout n'est qu'entrées et sorties. Un programme fonctionne avec trois canaux de communications.

Lorsque que l'on veut rediriger les entrées et les sorties standards d'un programme, on utilise les redirecteurs :

Redirecteur Utilisation
< STDIN
> STDOUT
2> STDERR
| STDOUT vers STDIN d'un autre process

Avec Perl, pour rediriger les sortie d'un programme, nous utilisons les filehandle . Pour ouvrir un filehandle , nous utilisons la commande open . Les redirecteurs sont exactement les mêmes que ceux d'Unix.

#!/usr/bin/perl

use strict;
my $file = "hello_world.pl";
if(open(IN,"<$file"))
{
    while(<IN>)
    {
        print $_;
    }
    close(IN);
}
else
{
    die "Can not read $file $!\n";
}

Nous venons de reconstituer de manière très basique la commande cat d'Unix. Le script vérifie qu'il peut ouvrir le fichier en l'adressant par le filehandle IN, puis il fait une boucle while qui dit que tant que des données rentrent par le filehandle il doit les imprimer.

La suite est simplement déductible.

Il est possible d'utiliser tous les truchements déjà disponibles dans le monde Unix, ainsi, ouvrir un filehandle de la sorte : open(IN,"cal |") permettra au programme de traiter la sortie standard de la commande cal .

Pour rajouter des informations en fin de fichier, il suffit d'utiliser la double redirection >> .

Il est possible que vous ne puissiez pas écrire ou lire un fichier. Pour cela, il est indispensable d'analyser le retour de la fonction open . Plusieurs solutions possibles.

open(IN,"<$file") or die("Oops\n$!\n");

C'est la solution la plus Perl qui soit, elle est claire, en une seule ligne et plutôt parlante.

Une autre approche, que préfereront les programmeurs en C :

if(open(IN,"<$file"))
{
    # traitement sur le fichier
    close(IN);
}
else
{
    die("Oops\n$!\n");
}

Que se passe-t-il si vous ne testez pas le retour de open ?

L'ouverture va échouer, malgré tout, le programme, qui n'a reçu aucune instruction en cas d'échec, va continuer à s'exécuter et plantera certainemant plus loin, au moment ou il devra se servir du filehandle qu'il croit ouvert. Plus loin, rendant l'opération de debugage plus compliqué.

Lorsque vous avez ouvert un filehandle en sortie, il est très simple d'écrire dessus. En fait, la fonction print écrit par défaut sur la sortie standard, il suffit de lui préciser un autre filehandle pour qu'elle écrive la ou vous le voulez :

#!/usr/local/bin/perl

use strict;
my $file = "fichier";
open(OUT,">$file") or die($!);
print OUT"Ceci est une information\n";
close(OUT);

Ce petit script marquera l'intérieur de fichier plutôt que l'écran.

Les filehandles sont automatiquement fermés à la fin du script, aussi l'appel à la fonction close est facultative. Pourtant, cela reste plus propre et plus compréhensible.


next up previous contents
Next: Boucles et conditions Up: Introduction à PERL Previous: Récupérer les variables du
Stephane TOUGARD
6/20/2001