PERL : syntaxe tableau de handle fichier
Résolu
java4ever
-
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21331 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 ?";
A voir également:
- PERL : syntaxe tableau de handle fichier
- Denon perl pro test - Accueil - Audio
- Active perl - Télécharger - Édition & Programmation
- DzSoft Perl Editor - Télécharger - Édition & Programmation
- Comment lire un fichier .pl perl ? - Forum Windows
- Perl: transformer un fichier en package ✓ - Forum Perl
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.
Ce bloc peut contenir aussi une expression
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
Je te remercie pour ta réponse sur laquelle j'ai "plussé"
Cordialement
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