Petit problème avec un hash, des tableaux et des références

Petit problème avec un hash, des tableaux et des références - Perl - Programmation

Marsh Posté le 09-12-2008 à 12:27:28    

Bonjour,
 
J'ai un soucis sur ce morceau de perl issu de mon programme :
 

Code :
  1. open(my $fh, "<", $this->get('file_datas')) or die("Error: can't open ".$this->get('file_datas')."\n" );
  2.  
  3. my $row = $csv->getline($fh);
  4. my @columns = @{$row};
  5. my $i = 0;
  6. while($row = $csv->getline($fh)) {
  7.    
  8.   my %line;
  9.    
  10.   my $j = 0;
  11.    
  12.   foreach(@{$row}) {
  13.      
  14.     $line{$columns[$j]} = $_;
  15.      
  16.     $j++;
  17.      
  18.   }
  19.   # Et la je fais qq chose avec %lines
  20. }


 
Pour simplifier ce code j'aimerai soit savoir s'il existe une methode de l'objet CSV qui renvoi directement un tableau Hash avec les clefs issu de la premières lignes du CSV. (J'en doute).
Soit savoir si on peut comme en PHP construire un tableau associatif a partir de deux tableaux (un contenant les clefsn l'autre les valeurs), comme je fais là mais en une seule fonction peut-être déjà existante.
 
Pour l'instant j'ai essayé pour soulager cette portion en déportant la création de ce hash dans une fonction dont voici la tête :
 

Code :
  1. sub get_csv_line {
  2.   my ($this, @columns, $row) = @_;
  3.  
  4.   my %line;
  5.  
  6.   my $i = 0;
  7.   foreach(@{$row}) {
  8.    
  9.     $line{$columns[$i]} = $_;
  10.    
  11.     $i++;
  12.    
  13.   }
  14.  
  15.   return %line;
  16.  
  17. }


 
Et dans cette fonction ce que je ne comprend c'est que si je fais un foreach sur @columns, je trouve dans la dernière case la référence vers le tableau "row".
 
Auriez vous quelques conseils ?
 
Merci d'avance?
Yellu


Message édité par yellu le 09-12-2008 à 12:28:41
Reply

Marsh Posté le 09-12-2008 à 12:27:28   

Reply

Marsh Posté le 09-12-2008 à 14:43:43    

Citation :

my ($this, @columns, $row) = @_;


Ca ne peut pas marcher, ça.
ton second element @columns tout bouffer de @_ (sauf sa premiere valeur, assignée a $this), et $row sera toujours vide.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 09-12-2008 à 15:02:08    

Citation :

Pour simplifier ce code j'aimerai soit savoir s'il existe une methode de l'objet CSV qui renvoi directement un tableau Hash avec les clefs issu de la premières lignes du CSV. (J'en doute).


Il me semble qu'il suffit de lire la doc de Text::CSV_XS pour trouver la réponse (si c'est bien ce module que tu utilises, cf un de tes précédents posts):
Tu fais pour la premiere ligne  (je coupe colle le code a partir de la doc)
$csv->column_names ($csv->getline ($io));
puis pour chacune des lignes ensuite
$hr = $csv->getline_hr ($io);
et $hr est une reference a un hash, par exemple si toto est un nom de champ en premiere ligne, tu accedes a la valeur correspondante dans la ligne par $hr->{toto}
 
A+,


Message édité par gilou le 09-12-2008 à 15:03:49

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 09-12-2008 à 15:35:14    

Je comprend maintenant pourquoi $row était vide, quand à la doc en effet, je l'ai pourtant lu mais dans la précipitation j'ai sauté les choses importantes :(
 
Merci beaucoup Gilou, encore une fois ;)

Reply

Sujets relatifs:

Leave a Replay

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