Perl tableau de tables de hashage

trinity666 -  
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
Configuration: Windows XP
Internet Explorer 7.0

4 réponses

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

    Après avoir fait

    @b=fonc2();

    mets un print "@b\n"; pour voir
    0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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