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] hash de hash


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 67
    Points : 34
    Points
    34
    Par défaut [langage] hash de hash
    Bonjour,
    j'ai besoin de construire un hash de hash, pour mettre les mois et les jours, je souhaiterai avoir une structure de type :


    janv fevr mars avril
    1 1 1 1
    2 2 2 2
    3 3 3 3
    4 4 4 4


    .....etc

    j'ai essayé avec $hash{$mois}{$jour}="$date".

    en fait, je dois passer absolument par des hashs de hash, car mon programme est plus compliqué que ça mais j'ai essayé de vous le simplifier.

    merci de l'aide

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    en fait, il me faut deux "scalaires" pour définir une clé unique.

  3. #3
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Concatene deux scalaires et ensuite tu "parseras" ta clef :
    MacOS 10.5 / Ubuntu / C / Python / R
    Pensez au tag résolu

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    tu peux être un peu plus explicite, stp

    où pourrais-je trouver de la doc sur les hash de hash ?

    merci

  5. #5
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Euh oui

    Je crois comprendre que tu as en fait 2 clefs (jour & mois)...

    je pensais que tu pouvais faire $hash{27.juin} au lieu de {27}{juin}

    Tu peux donner un exemple complet et dire a quoi correspond $date ?
    MacOS 10.5 / Ubuntu / C / Python / R
    Pensez au tag résolu

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    en fait ce n'est pas une date, c'est une température!
    donc il me faut un hash qui a pour clé primaire le mois et le jour (1 à 30 ).
    dc la clé est definie par deux scalaires et possède une valeur ( la température)
    je pensais que ca serait plus pratique en passant par un hash de hash.

  7. #7
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Ha ben alors mon astuce fonctionne (j'ai pas depose le concept bande de veinards ) ... Oui donc ton pb... Tu veux la temperature du 27 juin :

    $jour = 27 ... $mois = "juin" tu concatenes et tu obtiens 27.juin par exemple (tu laisses un . ~ entre les deux mais ce n'est pas important)...Et donc ta clef devient "27.juin" ... $hash{$clef} = $temp;

    Ca roule ca ? apres tu te fais une fonction qui cree l'ensemble des clefs dont tu as besoin. Si mon truc est idiot, tu as le droit de me le dire
    MacOS 10.5 / Ubuntu / C / Python / R
    Pensez au tag résolu

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    je trouve que c'est un bon astuce....mais il y a un truc qui ne va pas dans mon code car $jour reste tjrs à 0....mais je vais essayer de trouver toute seule !
    merci pour l'astuce!

  9. #9
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Choupi, les hash de hash ou les tableaux multidimensionnels fonctionnaient comme ça jusqu'à la version 4 de Perl (adieu les brevets sur le concept !! )
    Sinon je ne vois pas pourquoi Kinethe n'utiliserait pas de vrais hash de hash, ça coûte pas plus cher !
    Donc pour faire un hash de hash, c'est simple, il suffit de faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    %monhdh = ( machin => { truc => "bidule" } );
    Les différents types de parenthèses sont importants !!
    Si tu n'as pas besoin de l'initialiser en entier ou que tu le fait automatiquement, c'est encore plus simple, il te suffit de faire des trucs comme ça pour chaque élément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $monhdh{machin}{truc} = "bidule";
    Normalement ça marche...

    --
    Jedaï

  10. #10
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Mince alors... A vrai dire je donnais mon astuce n'ayant jamais eu à faire qq chose de plus "pro" avec ca

    Je peux breveter le clic de souris tu penses
    MacOS 10.5 / Ubuntu / C / Python / R
    Pensez au tag résolu

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    j'ai fait ce que tu as dit jedai,
    mais j'obtiens:
    janv HASH(0x835114)
    fevr HASH(0x835474)
    mars HASH(0x8359cc)
    avril HASH(0x835a50)
    avec le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $hash{$mois}{$jours}="$temperature[$boucle]";
     
    foreach my $key (keys(%hash))
    { print ($key, "\t", $hash {$key}, "\n");}
     
    	}
    ??????

  12. #12
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    Points : 54
    Points
    54
    Par défaut
    c normal, tu essayes de printer le sous-hash en entier, or c pas possible de printer un hash tel quel.
    En plus il faut le dereferencer, essaie donc ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    foreach my $key (keys(%monhdh)) 
      { 
        foreach my $k (keys(%{$monhdh{$key}})){
          print ($key, "\t", $k,"\t",$monhdh{$key}{$k}, "\n");
        } 
      }
    pas tres joli mais efficace...

    PS: c'est quoi
    $temperature[$boucle] ?
    tu veux dire $temperature{$boucle}, surement...

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    $temperature[$boucle] car j'ai un tableau qui contient toutes les températures.
    j'ai codé, comme tu m'as dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $hash{$mois}{$jours}="$temperature[$boucle]";
     
     foreach my $key (keys(%hash)) 
    { 
     foreach my $k (keys(%{$hash{$key}})){ 
     print ($key, "\t", $k,"\t",$hash{$key}{$k}, "\n"); 
     } 
    }
    mais j'obtiens la même chose que précédement:
    janv HASH(0x835114)
    fevr HASH(0x835474)
    mars HASH(0x8359cc)
    avril HASH(0x835a50)
    ?????

  14. #14
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    Points : 54
    Points
    54
    Par défaut
    bizarre...
    ton hash est bien du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    %hash:
      janv => %sshash:
                     1 => 10 
                     2 => 20 
                          ...
      fev => %sshash:
                     1 => 10
                     2 => 20
      ...
    non?
    Sinon pour voir la structure de ton hash, tu peux utiliser le module data::dumper
    et printer comme ca:
    print DUMP %hash;

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    désolée, je ne connait pas data::dumper ....

    pour ce qui est de mon hash, je le rempli avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $hash{$mois}{$jours}="$temperature[$boucle]";
    voilà.....
    je ne vois pas d'où vient mon pbl, mais je vais chercher cet aprèm.

    a+ et merci de l'aide.

  16. #16
    Membre du Club
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Points : 60
    Points
    60
    Par défaut
    Le hash ne peut pas contenir des hashs (à cause de l'interpolation des tableaux), mais peut bien contenir des références aux hashes. Il te faut écrire comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $hash {$mois} -> {$jours} = $temperature [$boucle];
    Et pour visualiser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    use Data::Dumper;
     
    print Dumper (\%hash);

  17. #17
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    @dmitry_ovsianko > Le "->" n'est obligatoire qu'avant le premier {} (si la variable est elle même une référence), sinon, il est superflu car le fait qu'il y ait plusieurs {} indique déjà qu'il s'agit d'une référence.

    --
    Jedaï

  18. #18
    Membre du Club
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Points : 60
    Points
    60
    Par défaut
    Oui, en effet... Pardon pour le spam

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

Discussions similaires

  1. Parcours d'un hash de hash de hash
    Par ngere dans le forum Langage
    Réponses: 5
    Dernier message: 06/07/2005, 09h53
  2. [langage] implementer un hash
    Par perlaud dans le forum Langage
    Réponses: 4
    Dernier message: 23/08/2004, 15h34
  3. [langage] reference et hash complex
    Par mlo dans le forum Langage
    Réponses: 4
    Dernier message: 07/07/2004, 17h46
  4. [langage] probleme avec un hash de hash
    Par planetevoyage dans le forum Langage
    Réponses: 4
    Dernier message: 06/06/2003, 12h55
  5. [langage] Créé un hash dans un fichier...
    Par Smooky dans le forum Langage
    Réponses: 3
    Dernier message: 26/03/2003, 08h49

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