PERL : syntaxe tableau de handle fichier

Résolu/Fermé
java4ever - 13 nov. 2011 à 11:00
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 13 nov. 2011 à 21:02
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 :
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 ?";
A voir également:

2 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
13 nov. 2011 à 20:30
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


1
Super lami20j, c'est le fait de mettre entre accolade qui est la formule magique (magique pour moi) je n'aurait, je pense jamais trouvé cette subtilité de syntaxe !
Je te remercie pour ta réponse sur laquelle j'ai "plussé"
Cordialement
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
Modifié par lami20j le 13/11/2011 à 21:02
De rien ;-)

Au début j'ai demandé le code puisque j'ai lu en diagonale, c'est à cause de ma paresse ;-)
Le plus important c'est que ça marche pour toi.

Merci et bonne soirée.

P.S. Je mets résolu
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
Modifié par lami20j le 13/11/2011 à 20:05
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
0