Perl - Tableau associatif et liste

Perl - Tableau associatif et liste - Perl - Programmation

Marsh Posté le 18-12-2018 à 12:58:13    

phdenis a écrit :

Bonjour à tous,
 
J'ai un problème avec une table de hachage et une liste.
 
J'arrive à créer une table de hachage simple c'est à dire en utilisant le code ci-dessous:
 

Code :
  1. my %Hash=();
  2. $Hash{MyInfoID_01} = MyInfoTitle_01;
  3. $Hash{MyInfoID_02} = MyInfoTitle_02;
  4. $Hash{MyInfoID_03} = MyInfoTitle_03;


 
J'arrive à créer une liste contenant plusieurs valeurs en utilisant le code ci-dessous:

Code :
  1. my @MyDList =();
  2. @MyDList =(DNode_01, DNode_02, DNode_03);
  3. my @MyCList =();
  4. @MyCList =(CNode_01);


 
 
Ce que je cherche à faire est de créer une table de hachage me permettant d'obtenir le résultat suivant:
 

Code :
  1. MyInfoID_01;MyInfoTitle_01;DNode_01;CNode_01
  2. MyInfoID_01;MyInfoTitle_01;DNode_02;
  3. MyInfoID_01;MyInfoTitle_01;DNode_03;
  4. MyInfoID_02;MyInfoTitle_02;DNode_02;
  5. MyInfoID_03;MyInfoTitle_03;DNode_03;CNode_02
  6. MyInfoID_03;MyInfoTitle_03;DNode_04;


 
C'est à dire arriver à lier ma tache de hachage avec ma MyCList ou MyDList afin d'avoir une arbre; j'ai essayé la syntaxe suivante sur la 1ere partie:

Code :
  1. @MyDList = (DNode_01, DNode_02, DNode_03);
  2. @MyCList = (CNode_01);
  3. $Hash{MyInfoID_01} = [MyInfoTitle_01, @MyDList, @MyCList];


 
Mais je n'arrive pas à parser mes listes et à imprimer chaque valeur qui les composent.
Y-a-t-il une syntaxe qui permettrait de nommer les champs du hash ?
 
En vous remerciant par avance, pour votre aide.
 
PS: Il ne s'agit pas d'un sujet pour l'école, je ne suis plus étudiant. Je suis juste intéressé par le langage perl qui me permet d'automatiser des tâches répétitives et fastidieuses.


Reply

Marsh Posté le 18-12-2018 à 12:58:13   

Reply

Marsh Posté le 18-12-2018 à 13:47:25    

Je crois que tu cherches le concept des références.

Code :
  1. use strict;
  2. use warnings;
  3.  
  4. my %hash;
  5.  
  6. my @array=(1,2,3);
  7. $hash{my_key}=[@array];
  8.  
  9. $hash{my_key}->[0]=42; #modifier une valeur
  10. $array[1]=43; #modifier une valeur dans le tableau d'origine ne change rien dans le hash car on a fait une copie dont on a pris la référence avec [@array]
  11.  
  12. print join(" ",@{$hash{my_key}}); #42, 2, 3


Ou si tu veux mettre un tableau contenant un autre tableau (ou précisément une référence vers un autre tableau) dans ta table de hashage:

Code :
  1. use strict;
  2. use warnings;
  3.  
  4. my %hash;
  5.  
  6. my $array_ref=[1,2,3]; #référence vers tableau anonyme
  7. my @array2=("aa", "bb", "cc" );
  8. $hash{my_key}=[@array2, $array_ref];
  9.  
  10. print $hash{my_key}->[0],"\n"; #aa
  11. $hash{my_key}->[3]->[0]=42;
  12. print $hash{my_key}->[3]->[0],"\n", #42
 

Les structures de données en Perl c'est un peu complexe quand on débute, je conseille un bon livre. Bon courage. ;)


Message édité par rat de combat le 18-12-2018 à 13:48:15
Reply

Marsh Posté le 18-12-2018 à 15:33:12    

Bonjour,
> $Hash{MyInfoID_01} = [MyInfoTitle_01, @MyDList, @MyCList];
Il faudrait faire en fait
$Hash{MyInfoID_01} = [MyInfoTitle_01, \@MyDList, \@MyCList];
 
A+,


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

Marsh Posté le 18-12-2018 à 15:36:40    

gilou a écrit :

Bonjour,Il faudrait faire en fait
$Hash{MyInfoID_01} = [MyInfoTitle_01, \@MyDList, \@MyCList];

Oui mais attention, si on modifie une valeur dans la structure de données on modifie le tableau et l'inverse. (ou je dis une bêtise? :o )


Message édité par rat de combat le 18-12-2018 à 15:36:50
Reply

Marsh Posté le 18-12-2018 à 15:45:11    

Bien sur, mais c'est ce qu'il veut, non?
Si tu veux une vraie copie statique, tu fais
$Hash{MyInfoID_01} = [MyInfoTitle_01, [@MyDList], [@MyCList]];  
A+,
 


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

Marsh Posté le 18-12-2018 à 16:27:10    

Le soucis c'est si on fait un truc du genre
faire(...)
    tableau=(rien)
    tableau=fonction_compliquée(paramètres)
    $hash{clé}=\@tableau
fin faire
 
on aura une mauvaise surprise à la fin, à savoir toutes les entrées qui contiennent les mêmes valeurs. Il faut passer par un tableau anonyme avec une référence dessus (comme tu l'expliques :jap: ). Ne me demande pas comment je sais ça. :o

Reply

Marsh Posté le 18-12-2018 à 16:51:46    

Mais ça c'est normal, puisque tu n'as qu'une variable, nommée tableau, toujours la même, donc avec toujours la même adresse.
Donc faire $hash{clé}=\@tableau c'est donner la même valeur (l'adresse unique de @tableau) à toutes les clés.
alors que quand on fait $hash{clé}=[...] on crée automatiquement un nouveau tableau à chaque fois (d'ou l'intérêt de l'anonymat).
A+,


Message édité par gilou le 18-12-2018 à 16:52:25

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

Marsh Posté le 18-12-2018 à 17:26:38    

Bien sûr, mais pour un débutant c'est un piège potentiel... :o

Reply

Marsh Posté le 21-12-2018 à 00:33:30    

Merci pour vos réponses, pour les livres si vous avez des références je suis preneur.

Reply

Sujets relatifs:

Leave a Replay

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