Perl tableau de tables de hashage

Fermé
trinity666 - 1 déc. 2008 à 14:35
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 12 janv. 2009 à 12:19
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

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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
12 janv. 2009 à 11:38
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
12 janv. 2009 à 11:54
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
12 janv. 2009 à 12:04
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
12 janv. 2009 à 12:12
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567 > Bestiau
12 janv. 2009 à 12:19
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
12 janv. 2009 à 11:44
Salut,

Après avoir fait

@b=fonc2();

mets un print "@b\n"; pour voir
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
12 janv. 2009 à 11:55
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
12 janv. 2009 à 12:17
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