PERL : syntaxe tableau de handle fichier
Résolu
java4ever
-
lami20j Messages postés 21506 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21506 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
Bonjour,
Je n'ai que peu d'expérience de PERL, et je bute sur le problème suivant :
Je veux ouvrir plusieurs fichiers et récupérer les handle's dans un tableau.
Ensuite, j'ai un traitement qui va, selon une valeur contextuelle, écrire en utilisant l'un des handle's de fichier, d'où le tableau.
J'arrive à le faire, mais je suis obligé de passer par une variable intermédiaire, quelqu'un peut-t-il me dire pourquoi la façon dont j'appelle la fonction print avec un indice du tableau ne marche pas ?
Voici le code qui pose problème (il s'agit d'une extraction, vous l'aurez compris :
Je n'ai que peu d'expérience de PERL, et je bute sur le problème suivant :
Je veux ouvrir plusieurs fichiers et récupérer les handle's dans un tableau.
Ensuite, j'ai un traitement qui va, selon une valeur contextuelle, écrire en utilisant l'un des handle's de fichier, d'où le tableau.
J'arrive à le faire, mais je suis obligé de passer par une variable intermédiaire, quelqu'un peut-t-il me dire pourquoi la façon dont j'appelle la fonction print avec un indice du tableau ne marche pas ?
Voici le code qui pose problème (il s'agit d'une extraction, vous l'aurez compris :
use strict;
use warnings;
use Symbol;
# programme perl
# Problème de syntaxe du print dans un fichier avec un handle de fichier dans un tableau
# Note c'est dans un tableau parce que dans la vie réelle il y a besoin de plusieurs handle
# Mais on n'en met qu'un pour simplifier
my $f = "toto.txt";
my @fhs; # tableau de handle's
open(my $fh, '>', $f) or die "Cannot open $f: $!";
push @fhs, $fh; # place le handdle dans le tableau
# print $fhs[0] . "\n"; # on peut vérifier qu'il y a bien une valeur
# Les 2 lignes ci-dessous marchent (on peut vérifier que le fichier toto.txt contient bien le texte
my $fh2 = $fhs[0];
print ($fh2 "bonjour les amis fh2 ");
# ******* La ligne ci-dessous ne marche pas (indique : "Not a CODE reference at test01.pl line 18.")
# print ($fhs[0] "bonjour les amis KO ");
# La ligne ci-dessous marche aussi alors qu'on appelle "de la même façon" que pour le print
close $fhs[0];
print ($fh2 "tentative de print apres le close provoque bien une erreur");
# print "fini : qui peut m'expliquer ?";
2 réponses
-
Bon, pas vraiment besoin de ton code. Si j'ai bien compris tu veux quelque chose comme ça.
Il faut utiliser un bloc où on veut placer un descripteur.
lami20j@debian-acer:~/perl$ cat toto.txt lami20j@debian-acer:~/perl$ cat titi.txt lami20j@debian-acer:~/perl$ cat 2handle.pl #!/usr/bin/perl use strict;use warnings; open my $f1,">toto.txt" or die "E/S : $!\n"; open my $f2, ">titi.txt" or die "E/S : $!\n"; push my @fhs,($f1,$f2); print { $fhs[0] } "salut toto\n"; close $fhs[0] ; print { $fhs[1] } "salut titi\n"; close $fhs[1]; __END__ lami20j@debian-acer:~/perl$ perl -cx 2handle.pl 2handle.pl syntax OK lami20j@debian-acer:~/perl$ perl 2handle.pl lami20j@debian-acer:~/perl$ cat toto.txt salut toto lami20j@debian-acer:~/perl$ cat titi.txt salut titi
Ce bloc peut contenir aussi une expression
lami20j@debian-acer:~/perl$ cat toto.txt lami20j@debian-acer:~/perl$ cat titi.txt lami20j@debian-acer:~/perl$ cat 2handle_choix.pl #!/usr/bin/perl use strict;use warnings; open my $f1,">toto.txt" or die "E/S : $!\n"; open my $f2, ">titi.txt" or die "E/S : $!\n"; push my @fhs,($f1,$f2); print "Quel descripteur utilisé 1 ou 2 ? "; chomp (my $choix=<STDIN>); print { $choix==1?$fhs[0] : $fhs[1] } "salut\n"; close $fhs[0] ; close $fhs[1]; __END__ lami20j@debian-acer:~/perl$ perl -cx 2handle_choix.pl 2handle_choix.pl syntax OK lami20j@debian-acer:~/perl$ perl 2handle_choix.pl Quel descripteur utilisé 1 ou 2 ? 2 lami20j@debian-acer:~/perl$ cat toto.txt lami20j@debian-acer:~/perl$ cat titi.txt salut
-
Salut,
# Mais on n'en met qu'un pour simplifier
Justement comme tu veux utiliser un tableau des handle alors simplifier veut dire que tu dois donner un exemple avec deux.
Avec un, pas besoin de tableau ;-)
Peux-tu donner tout le code?
lami20j