Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2880 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Mettre un tableau dans une hash ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Mettre un tableau dans une hash ?

n°1394529
greeeg
Posté le 25-06-2006 à 17:58:11  profilanswer
 

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
mood
Publicité
Posté le 25-06-2006 à 17:58:11  profilanswer
 

n°1394602
pospos
Posté le 25-06-2006 à 20:42:11  profilanswer
 

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
n°1394662
Taz
bisounours-codeur
Posté le 25-06-2006 à 23:12:23  profilanswer
 

keys / values ?

n°1394667
pospos
Posté le 25-06-2006 à 23:30:37  profilanswer
 

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
n°1436270
greeeg
Posté le 04-09-2006 à 15:29:08  profilanswer
 
n°1436273
anapajari
s/travail/glanding on hfr/gs;
Posté le 04-09-2006 à 15:31:15  profilanswer
 


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

n°1436277
greeeg
Posté le 04-09-2006 à 15:40:35  profilanswer
 

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. }

n°1436334
anapajari
s/travail/glanding on hfr/gs;
Posté le 04-09-2006 à 17:03:18  profilanswer
 

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;

n°1436337
greeeg
Posté le 04-09-2006 à 17:07:01  profilanswer
 

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.
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Mettre un tableau dans une hash ?

 

Sujets relatifs
Random sur un tableau de booléen ![RESOLU] Mettre un Objet comme attribut d'un autre Objet
Mettre un fichier en downloadtrouver adresse matrice/tableau
mettre une feuille excel à la fin d'un classeurRécupérer valeurs sous forme d'1 tableau à partir d'un tableau de clés
(vba excel) consolidation de tableauTableau height="100%" fonctionne pas
Mettre du XML dans du HTML et utiliser un XSL[xml/xsl] probleme pour faire un tableau
Plus de sujets relatifs à : Mettre un tableau dans une hash ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR