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.