Perl tableau de tables de hashage

trinity666 -  
lami20j Messages postés 21331 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

4 réponses

Bestiau
 
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...)
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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.
0
Bestiau > lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
 
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...
0
Bestiau > Bestiau
 
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";
0
Bestiau > Bestiau
 
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
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570 > Bestiau
 
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

Après avoir fait

@b=fonc2();

mets un print "@b\n"; pour voir
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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 exemple
my $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; 
} 
ou
sub 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 encore
sub 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; 
}
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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;



0