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   -
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 ?";

2 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
    1. java4ever
       
      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
    2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      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
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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