Problème de hachage

Problème de hachage - Perl - Programmation

Marsh Posté le 13-10-2008 à 22:19:40    

Bonjour, j'ai un problème avec ce script tout bidon pour m'entraîner aux hachages. Je n'obtiens pas de résultat j'ai l'erreur suivante :
 

Code :
  1. Global symbol "%hashe" requires explicit package name at C:\Perl\Exercice.PL line 65.
  2. Global symbol "%hashe" requires explicit package name at C:\Perl\Exercice.PL line 66.
  3. Execution of C:\Perl\Exercice.PL aborted due to compilation errors.


 
Voilà le script :
 

Code :
  1. sub hash {
  2. my $i;
  3. for ($i=1; $i<4; $i++) {
  4. print 'entrer les valeurs nom, prénom, age de votre enregistrement', "\n";
  5. my $nom =<>;
  6. my $prenom=<>;
  7. my $age=<>;
  8. chomp($nom);
  9. chomp($prenom);
  10. chomp($age);
  11. my %hashe = ("$nom" => ["$prenom", "$age"]);
  12. }
  13. print "entrer le nom de la personne a afficher\n";
  14. my $search=<>; chomp($search);
  15. #print "$hashe{alain}";
  16. #print "$hashe{$search}";
  17. my $key;
  18. my $val;
  19. foreach $key (sort keys %hashe) { # <== ligne 65
  20. $val = $hashe{$key};                   # <== ligne 66
  21. print "Key $key has value $val\n";
  22. }
  23. }


 
Si quelqu'un peut me mettre sur la voie et me dire ou est le problème.

Reply

Marsh Posté le 13-10-2008 à 22:19:40   

Reply

Marsh Posté le 13-10-2008 à 23:44:05    

hashe est déclaré dans la boucle

Reply

Marsh Posté le 14-10-2008 à 18:20:21    

Merci Taz ça a résolu le problème seulement l'affichage m'indique une référence vers la valeur apparemment. J'obtiens sur le print : ARRAY (0x2247FFF) alors que je voudrais retourner les valeurs de la clé ...
 
Voila le code :  
 

Code :
  1. sub hash {
  2. my $i;
  3. my %hashe;
  4. for ($i=1; $i<4; $i++) {
  5. print 'entrer les valeurs nom, prénom, age de votre enregistrement', "\n";
  6. my $nom =<>;
  7. my $prenom=<>;
  8. my $age=<>;
  9. chomp($nom);
  10. chomp($prenom);
  11. chomp($age);
  12. %hashe = ("$nom" => ["$prenom", "$age"]);
  13. }
  14. print "entrer le nom de la personne a afficher\n";
  15. my $search=<>; chomp($search);
  16. print "Les informations sur $search sont : $hashe{$search}";
  17. }


Message édité par seb-info le 14-10-2008 à 18:21:36
Reply

Marsh Posté le 14-10-2008 à 19:23:41    

C'est logique, car tu fais:

Citation :

("$nom" => ["$prenom", "$age"])


Donc $hashe{$nom} te renvoie la valeur de ["$prenom", "$age"], une reference a un array anonyme, d'ou ton ARRAY quand tu fais un print.
A+,


Message édité par gilou le 14-10-2008 à 19:24:02

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

Marsh Posté le 14-10-2008 à 23:04:59    

Je saisie pas ... pourquoi tu parles de array anonyme ? Les variables ("$nom" => ["$prenom", "$age"]) sont bien interprétées ?

Reply

Marsh Posté le 15-10-2008 à 00:04:52    

et ? [] c'est quand même une référence à un array anonyme

Reply

Marsh Posté le 15-10-2008 à 11:36:43    

Si tu veux le tableau plutôt que ça référence, il faut... Déréférencer : @{$hashe{$search}}. Si tu veux accéder à un élément du tableau tu peux aussi faire $hashe{$search}->[0], qui est équivalent à @{$hashe{$search}}[0].
 
Edit : et aussi tant que j'y suis, dans ta boucle à chaque passage tu écrases %hashe, alors que ce que tu veux, je suppose, c'est ajouter un élément au hash. Il faudrait plutôt faire $hashe{$nom} = ["$prenom", "$age"].


Message édité par matafan le 15-10-2008 à 11:39:12
Reply

Marsh Posté le 15-10-2008 à 12:15:48    

C'est pas juste, tu lui indique d'un coup les problemes majeurs de son code (ca sautait aux yeux a la premiere lecture, hein), alors qu'on pouvait laisser mijoter ce script toute la semaine :/
A+,


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

Marsh Posté le 15-10-2008 à 12:58:56    

Ben ouais je suis comme ça moi, je casse les jouets des autres :P

Reply

Marsh Posté le 15-10-2008 à 21:33:22    

lool gilou je pense que ça aurai pu même mijoter plus que ça si je comptais seulement sur moi. Mais bon ya les forums et les relations. Je pense que l'aide et les exemples sont les meilleurs moyens d'apprendre.
 
Alors merci matafan et pas très cool gilou sur ce coup là ... à quoi aurai servi de laisser "mijoter" le script une semaine ?
 
Sinon une autre question vu que y'avait pas mal d'erreur  :heink: est ce que c'est "propre" d'écrire un hachage comme je l'ai fait ?

Message cité 1 fois
Message édité par seb-info le 15-10-2008 à 21:40:03
Reply

Marsh Posté le 15-10-2008 à 21:33:22   

Reply

Marsh Posté le 15-10-2008 à 21:53:39    

Oui c'est propre, c'est même tout à fait classique.

Reply

Marsh Posté le 15-10-2008 à 22:24:40    

Ok ! Merci !

Reply

Marsh Posté le 15-10-2008 à 23:15:03    

seb-info a écrit :

Alors merci matafan et pas très cool gilou sur ce coup là ... à quoi aurai servi de laisser "mijoter" le script une semaine ?

A te faire progresser pas a pas dans la compréhension de ce qui n'allait pas dans ton script, alors qu'une solution prête a l'emploi risque fort de ne pas améliorer tes connaissances en perl.
A+,


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

Marsh Posté le 16-10-2008 à 19:23:58    

Je pense pas que ça soit plus profitable au contraire. Se butter sur quelque chose sans parvenir à ses fins je trouve ça plutôt décourageant et puis il y a certaine personnes ( comme moi :D ) qui ont besoin qu'on leur montre une fois pour ensuite assimiler. Je pense pas être le seul.

Reply

Sujets relatifs:

Leave a Replay

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