Mettre un tableau dans une hash ?

Mettre un tableau dans une hash ? - Perl - Programmation

Marsh Posté le 25-06-2006 à 17:58:11    

Bonjour,  
 
J'ai le code suivant :
 

Code :
  1. ...
  2. %retour = ("TempPotentielle" => $temperaturePotentielle,
  3.    "IntersectionTemp" => $intersectionTemperature,
  4.    "BaseNuage" => $baseNuage,
  5.    "SommetNuage" => $sommetNuage,
  6.    "ThermiqueBleu" => $thermiqueBleu,
  7.    "ZoneHumide" => @zoneHumide);
  8. return %retour;


 

Code :
  1. my %valeur = $ema->analyseBrute();
  2. $ema->analyseTextuelle(\\%valeur);


(la première ligne ici appelle la fct dont l'extrait est ci-dessus)
 
puis dans ma fonction analyseTextuelle, j'ai :
 

Code :
  1. sub analyseTextuelle {
  2. my ($ptr) = $_[1];
  3. ...
  4. print "Test nuages epars ". $$ptr{ZoneHumide}[0] . "\n";
  5. }


 
Or rien ne s'affiche dans mon print.
Question logique alors : comment accéder à l'element i d'un tableau mis dans une hash ?
 
Merci beaucoup


Message édité par greeeg le 25-06-2006 à 17:59:35
Reply

Marsh Posté le 25-06-2006 à 17:58:11   

Reply

Marsh Posté le 25-06-2006 à 20:42:11    

tu ne peux maitre qu'un scalar en valeur dand une hash, donc ici si tu veux y mettre un tableau il faut mettre un scalair contenant une reference vers ce tableau:
 
dans ta hash:
ZoneHumie => \@zonehime
 
et ensutie pour y acceder: $ptr->{ZoneHumide}->[0] (on peut meme virer la deuxieme fleche dans ce cas precis, mais il vaut mieux la laisser pour mieux comprendre ce qui se passe)
 
De meme, pour des raisons d'efficacité, je te conseil de plutot retourner une reference de ta hash plutot que la hash entiere, pour eviter une copie inutile de celle ci:
 
return \%retour;
...
my $valeur_ref = $ema->analyseBrute;
$ema->analyseTextuelle($valeur_ref);

Message cité 1 fois
Message édité par pospos le 25-06-2006 à 23:26:17
Reply

Marsh Posté le 25-06-2006 à 23:12:23    

keys / values ?

Reply

Marsh Posté le 25-06-2006 à 23:30:37    

il veut lire/ecrire une liste dans une hash, pas obtenir la liste des clés/valeurs


Message édité par pospos le 25-06-2006 à 23:30:45
Reply

Marsh Posté le 04-09-2006 à 15:29:08    

Reply

Marsh Posté le 04-09-2006 à 15:31:15    


comment ça up??? Pospos t'a expliqué tout bien tout clairement [:mlc]

Reply

Marsh Posté le 04-09-2006 à 15:40:35    

pospos a écrit :

tu ne peux maitre qu'un scalar en valeur dand une hash, donc ici si tu veux y mettre un tableau il faut mettre un scalair contenant une reference vers ce tableau:
 
dans ta hash:
ZoneHumie => \@zonehime
 
et ensutie pour y acceder: $ptr->{ZoneHumide}->[0] (on peut meme virer la deuxieme fleche dans ce cas precis, mais il vaut mieux la laisser pour mieux comprendre ce qui se passe)
 
De meme, pour des raisons d'efficacité, je te conseil de plutot retourner une reference de ta hash plutot que la hash entiere, pour eviter une copie inutile de celle ci:
 
return \%retour;
...
my $valeur_ref = $ema->analyseBrute;
$ema->analyseTextuelle($valeur_ref);


 
Ok. Voici un autre code pour lequel le problème est un poil différent. A chaque itération je réinitialise le tableau @tab alors forcemment ça ne joura plus avec les pointeurs. Comment faire ?
 

Code :
  1. my @tab = ();
  2. my $acPrecedent = "";
  3. my %hash = ();
  4. # On extrait tous les resultats
  5. while(my @row = $cursor->fetchrow) {
  6. if($acPrecedent eq $accession){  # Dans ce cas, on ajoute les ac
  7.  push(@tab, $seg_start);
  8. }
  9. else {     # Sinon on a un new ac -> creation d'un new tab
  10.  if($#tab >= 0) {  # On ajoute le tab dans la hash seulement s'il est rempli
  11.   $hash{$accession} = \\@tab;
  12.  }
  13.  @tab = ();   # Remise a 0 du tableau
  14.  push(@tab, $seg_start);  # Ajout du premier element
  15.  $acPrecedent = $accession; # Sauvegarde du nouvel ac
  16. }
  17. }

Reply

Marsh Posté le 04-09-2006 à 17:03:18    

moi je sens plutot l'algo foireux !!!
Il sort d'ou ton $accession? Vu que tu ne le changes jamais au cours de tes itérations ton  

Code :
  1. $hash{$accession} = \@tab;

 
met toujours tout sur la même clé [:spamafote]
 
Mais bref dans ce cas précis, n'utilise pas de tableau mais directement un référence sur celui-ci! Petit exemple ( je reprends pas ton code que je trouve fort étrange :o ):

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use Data::Dumper;
  4. my %h;
  5. my $t;
  6. for(my $i=1; $i<13; $i++){
  7.   if ( $i%3 ){
  8.     push @$t, $i;
  9.   } else {
  10.     $h{$i} = $t;
  11.     undef $t;
  12.   }
  13. }
  14. print Dumper %h;

Reply

Marsh Posté le 04-09-2006 à 17:07:01    

Ben mon $ accession est extrait du résultat d'une requete sur une BDD via $cursor->fetchrow.
Mon code marche nickel (sauf qu'à la ligne 12 c'est $acPrecedent et non pas $accession), sauf le problème d'insertion de la bonne valeur de pointeur dans la hash.
 
Je vais regarder ton code tranquillement à la maison.
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed