IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

[langage] probleme avec un hash de hash


Sujet :

Langage Perl

  1. #1
    En attente de confirmation mail
    Inscrit en
    Février 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 40
    Points : 39
    Points
    39
    Par défaut [langage] probleme avec un hash de hash
    Bonjour,

    voila mon probleme :

    Je veux creer un hash de hash alors j'ai procédé de la maniere suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    my %allClasseIdx;
    my %clTmp;
     
     
    $clTmp{Label} = "classe2";
    $clTmp{Ext} = 9;
    $clTmp{Int} = 9;
    $clTmp{VE} = 10;
    $allClasseIdx{cl2} = \%clTmp;
     
     
    $clTmp{Label} ="";
    $clTmp{Label} = "classe3a";
    $clTmp{Ext} = 13;
    $clTmp{Int} = 14;
    $clTmp{VE} = 17;
    $allClasseIdx{cl3a} = \%clTmp;
    Le problème est que lorsque je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print "Label classe 2 : $allClasseIdx{cl2}{Label}\n";
    J'obtient classe3a au lieu de classe2 !!

    Je ne vois vraiement pas pourquoi. Si vous pouvez m'éclairer !

    Jérôme

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2002
    Messages : 68
    Points : 73
    Points
    73
    Par défaut
    Ca ce n'est pas un hash de hash mais 2 hash dans un hash :
    Je m'explique, toi tu as créé ca :
    hash :
    - hash1 =>data
    - hash2 =>data

    Alors qu'il aurait fallu créé ca :

    hash : - hash1=>hash2=>data

    Ca c'est un hash de hash.
    C'est ton initialisation qui ne va pas, voilà l'init d'un hash de hash :
    hash{hash1}{hash2} = data;
    Ce n’est pas parce que les choses sont difficiles que nous n’osons pas ; c’est parce que nous n’osons pas qu’elles sont difficiles.
    Sénèque

  3. #3
    En attente de confirmation mail
    Inscrit en
    Mars 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 67
    Points : 75
    Points
    75
    Par défaut
    ton problème est tout simplement que tu écrases les premières valeurs de ton hash %clTmp par les deuxièmes. L'adresse mémoire de ce hash est tj la même, donc quand tu le déréférences, il te donne les dernières valeurs qu'il a en stock...plutôt que d'utiliser un hash temporaire, utilise un hashage anonyme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    use strict
     
    my %allClasseIdx = ();
     
    $allClasseIdx{cl2} = {'Label' => 'classe2', 'Ext' => '9'};
    $allClasseIdx{cl3a} = {'Label' => 'classe3a', 'Ext' => '13'};
     
    print "Label classe2 = ", ${$allClasseIdx{cl2}}{Label};

  4. #4
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut Re: probleme avec un hash de hash
    Citation Envoyé par planetevoyage
    Bonjour,

    voila mon probleme :

    Je veux creer un hash de hash alors j'ai procédé de la maniere suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    my %allClasseIdx;
    my %clTmp;
     
     
    $clTmp{Label} = "classe2";
    $clTmp{Ext} = 9;
    $clTmp{Int} = 9;
    $clTmp{VE} = 10;
    $allClasseIdx{cl2} = \%clTmp;
     
     
    $clTmp{Label} ="";
    $clTmp{Label} = "classe3a";
    $clTmp{Ext} = 13;
    $clTmp{Int} = 14;
    $clTmp{VE} = 17;
    $allClasseIdx{cl3a} = \%clTmp;
    Le problème est que lorsque je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print "Label classe 2 : $allClasseIdx{cl2}{Label}\n";
    J'obtient classe3a au lieu de classe2 !!

    Je ne vois vraiement pas pourquoi. Si vous pouvez m'éclairer !

    Jérôme
    C'est une erreur classique.
    Donc voici deja comment la regler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    my %allClasseIdx;
    my %clTmp;
     
     
    $allClasseIdx{cl2} = {};
    $clTmp{Label} = "classe2";
    $clTmp{Ext} = 9;
    $clTmp{Int} = 9;
    $clTmp{VE} = 10;
    $allClasseIdx{cl2} = {%clTmp};
     
     
    $clTmp{Label} ="";
    $clTmp{Label} = "classe3a";
    $clTmp{Ext} = 13;
    $clTmp{Int} = 14;
    $clTmp{VE} = 17;
    $allClasseIdx{cl3a} = {%clTmp};
     
    print "Label classe 2 : ${$allClasseIdx{cl2}}{Label}\n";
    Le probleme venait de cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $allClasseIdx{cl2} = \%clTmp;
    Quand tu fais cela, il va pointer sur une zone memoire. Ensuite tu modifies cette zone memoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $clTmp{Label} = "classe3a";
    Et par consequent la valeur dans $allClasseIdx{cl2} {Label} change aussi.
    Pour remedier a cela, il faut utiliser l'operateur {} pour que Perl fasse une copie en meme temps. Ainsi tu auras une valeur qui ne changera pas dans ton tableau.

    J'espere que c'est clair .

    Cordialement

  5. #5
    En attente de confirmation mail
    Inscrit en
    Février 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 40
    Points : 39
    Points
    39
    Par défaut
    Merci c'est tres clair

    Jérome

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 13/08/2004, 12h32
  2. [langage] Probleme avec commande system et code
    Par Ludo167 dans le forum Langage
    Réponses: 3
    Dernier message: 14/07/2004, 12h01
  3. [langage] Problem avec split
    Par Ludo167 dans le forum Langage
    Réponses: 4
    Dernier message: 08/07/2004, 14h42
  4. [langage] probleme avec les listes dans des listes
    Par pqmoltonel dans le forum Langage
    Réponses: 7
    Dernier message: 27/04/2004, 12h32
  5. [langage] problème avec fonction read
    Par domidum54 dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2004, 20h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo