Perl tableau de tables de hashage
trinity666
-
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,
voici ma fonction retournant un tableau de tables de hashages:
sub fonc2{
my @a=();
my %c={"a"=>"1","b"=>"2","c"=>"3"};
my %d={"d"=>"4","e"=>"5","f"=>"6"};
my %e={"g"=>"7","h"=>"8","i"=>"9","j"=>"10"};
$a[0]=\%c;
$a[1]=\%d;
$a[2]=\%e;
return @a;
}
lorsque je veux récupérer @a je fais:
@b=fonc2();
je veux récupérer mes tables de hash je ne sais pas comment faire j'ai tout essayé:
%h=%{$b[0]} ne marche pas
%h=%{%{$b[0]}} non plus
%h=%{${$b[0]}} non plus
%h=%{%{@b[0]}} non plus
j'ai meme essayé d'enlever les références de ma fonction:
$a[0]=%c;
$a[1]=%d;
$a[2]=%e;
dans la table b il y a des symboles bizarres :1/81/81/8
les tables de hashage sont vides
comment faire
ca fait 2 jours que je cherche
merci par avance
voici ma fonction retournant un tableau de tables de hashages:
sub fonc2{
my @a=();
my %c={"a"=>"1","b"=>"2","c"=>"3"};
my %d={"d"=>"4","e"=>"5","f"=>"6"};
my %e={"g"=>"7","h"=>"8","i"=>"9","j"=>"10"};
$a[0]=\%c;
$a[1]=\%d;
$a[2]=\%e;
return @a;
}
lorsque je veux récupérer @a je fais:
@b=fonc2();
je veux récupérer mes tables de hash je ne sais pas comment faire j'ai tout essayé:
%h=%{$b[0]} ne marche pas
%h=%{%{$b[0]}} non plus
%h=%{${$b[0]}} non plus
%h=%{%{@b[0]}} non plus
j'ai meme essayé d'enlever les références de ma fonction:
$a[0]=%c;
$a[1]=%d;
$a[2]=%e;
dans la table b il y a des symboles bizarres :1/81/81/8
les tables de hashage sont vides
comment faire
ca fait 2 jours que je cherche
merci par avance
Configuration: Windows XP Internet Explorer 7.0
4 réponses
-
j'ai le même problème.
Posé plus simplement ça donnerait : comment faire pour qu'une fonction renvoie deux tables de hashages, et surtout pour récupérer ces deux tables en évitant leur applatissement (que les deux tables se retrouvent dans une seule liste...)-
Salut,
et surtout pour récupérer ces deux tables en évitant leur applatissement (que les deux tables se retrouvent dans une seule liste...)
En utilisant les références.- oui, c'est vers les références que j'étais justement en train de me tourner, mais je galère à trouver la bonne syntaxe : j'étais en train de tester :
sub Extract_data_tag { open(RES_MATCH, "<$opt_r") or die("Impossible d'ouvrir le fichier $opt_r"); my (@liste_FT) = (); my (%FT, %tags) = (); my ($tag_id, $tss, $ref_res) = (); [...] $ref_res = [%tags, %FT]; return $ref_res; } my $ref_data = &Extract_data_tag(); my %tags_infos = $ref_data ->[0]; my %liste_FT = $ref_data ->[1]; print "Nombre de tags : ".scalar(keys(%tags_infos))."\n";
Mais bien évidemment ça marche pas...
Sauf que j'arrive pas à trouver la coquille... - avec la fonction entière c'est peut être plus simple de voir s'il y a une erreur :
sub Extract_data_tag { open(RES_MATCH, "<$opt_r") or die("Impossible d'ouvrir le fichier $opt_r"); my (@liste_FT) = (); my (%FT, %tags) = (); my ($tag_id, $tss, $ref_res) = (); my $line; my $cpt = 0; while(defined($line = <RES_MATCH>)) { if($line =~m/Tag_id (\d+), .+, TSS (\d+), FT (.+), \n/) { $cpt ++; $tag_id = $1; $tss = $2; $tags{$tag_id} = {"TSS" => $tss, "liste_FT" => $3}; @liste_FT = split(", ", $3); foreach my $factor (@liste_FT) { $FT{$factor} = 1; } } } close(RES_MATCH); print "\nNb de FT different trouves : ".keys(%FT)."\n\n"; print "Nb de tags : $cpt\n"; $ref_res = [%tags, %FT]; return $ref_res; }
suivi de l'appel de la fonction :my $ref_data = &Extract_data_tag(); my %tags_infos = $ref_data ->[0]; my %liste_FT = $ref_data ->[1]; print "Nombre de tags : ".keys(%tags_infos)."\n";
- J'ai trouvé la solution :
my @ref_data = &Extract_data_tag(); my $ref1 = $ref_data[0]; my $ref2 = $ref_data[1]; my %tags_infos = %$ref1; my %liste_FT = %$ref2; sub Extract_data_tag { open(RES_MATCH, "<$opt_r") or die("Impossible d'ouvrir le fichier $opt_r"); my (@liste_FT) = (); my (%FT, %tags) = (); my ($tag_id, $tss, @ref_res) = (); [...] @ref_res = (\%tags, \%FT); return @ref_res; }
Le problème est dnc résolu pour moi - Re,
On était en train de poster en même temps ;-).
http://www.commentcamarche.net/forum/affich 9694055 perl tableau de tables de hashage?#8
-
-
Salut,
Après avoir fait
@b=fonc2();
mets un print "@b\n"; pour voir -
Re,
Tu dois utiliser les paranthèses pour la définition d'un hash et pas les accolades ;-)
Ici my %c={"a"=>"1","b"=>"2","c"=>"3"}; , tu affectes un hash anonyme à un hash au lieu d'affecter à un scalaire.
Par exemplemy $c={"a"=>"1","b"=>"2","c"=>"3"};
Voici quelque version pour ta fonction
sub fonc2{ my @a=(); my %c=("a"=>"1","b"=>"2","c"=>"3"); my %d=("d"=>"4","e"=>"5","f"=>"6"); my %e=("g"=>"7","h"=>"8","i"=>"9","j"=>"10"); $a[0]=\%c; $a[1]=\%d; $a[2]=\%e; return @a; }ousub fonc2{ my %c=("a"=>"1","b"=>"2","c"=>"3"); my %d=("d"=>"4","e"=>"5","f"=>"6"); my %e=("g"=>"7","h"=>"8","i"=>"9","j"=>"10"); my @a=(\%c,\%d,\%e); return @a; }ou encoresub fonc2{ my @a = (); $a[0] = {"a"=>"1","b"=>"2","c"=>"3"}; $a[1] = {"d"=>"4","e"=>"5","f"=>"6"}; $a[2] = {"g"=>"7","h"=>"8","i"=>"9","j"=>"10"}; return @a; } -
Salut,
Ici $ref_res = [%tags, %FT]; tes hash perdent leur identité.
Tu n'as qu'une référence vers un tableau anonymé.
Essaie@ref_res = (\%tags, \%FT); return @ref_res;