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 :

Affichage d'une table de hachage


Sujet :

Langage Perl

  1. #1
    Membre du Club Avatar de pymouse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 137
    Points : 67
    Points
    67
    Par défaut Affichage d'une table de hachage
    Slt,

    Comment récupérer les valeurs d'une table de hachage référencé dans une autre?
    Voici le code "en gros" de ce que je fait :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    my %H_str;
    my %H_str2;
     
    while(...)
    {
      while(...)
      {
        #je remplis ma premiere table de hash
        $H_str{"mykey"} = [ $v1,$v2 ];
      }
    #je remplis ma deuxieme table, avec une référence sur H_str
    # je ne sais pas si c'est la bonne solution...
    $H_str2{"mykey2"} = [ %H_str ];
    }
     
    #Affichage
    # losrque je met %H_hash, j'ai un warning : 0dd number of elments in hash ...
    # Pourtant c'est un une table de hachage qui devrait être retournée, ou tout du moin une référence?
    #while( my ($key,%H_hash) = each(%H_str2)
    #{
    # ...
    #}
    # là sa fonctionne
    while( my ($key,@tab) = each(%H_str2)
    {
    foreach my $v (@tab)
    {
    print "$v->[0]\n $v->[1]\n $v->[2]..."
    #ce qui m'affiche :
    #$v->[0] = une key de H_str
    #$v->[1] = une ARRAY (correspond à la key)
    #$v->[2] = la key de H_str
    #$v->[3] = une ARRAY (correspond à la key)
    # etc... suivant le nombre d'élément dans la hash référencée
    }
    }
    Si quelqu'un pouvais m'éclairer, je suis un peu perdu avec mes références

  2. #2
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Bonjour,

    Je ne pense pas que ce code fasse ce que tu penses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #je remplis ma deuxieme table, avec une référence sur H_str
    # je ne sais pas si c'est la bonne solution...
    $H_str2{"mykey2"} = [ %H_str ];
    Il faut savoir qu'en Perl, les listes son interpolés, et que les hashs ne sont que des listes déguisées. [%H_str] ne construit pas une référence de %H_str, cela construit une référence anonyme à un tableau contenant tous les couples clés/valeur de ta table %H_str.

    Pour créer une référence à %H_str, il faut écrire \%H_str.
    De même, pour me remplissage de ton premier hash, je ne suis pas convaincu que le code fasse ce que tu veux. Dans ton exemple, $H_str{"mykey"} retournera une référence à un tableau contenant deux éléments. Est vraiment ce que tu veux ?

    Si tu es un peu perdi avec les références, je te conseille de lire la FAQ à ce sujet.

    Sinon, si tu veux de l'aide sur ton code, explique nous ce que tu veux faire
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  3. #3
    Membre du Club Avatar de pymouse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 137
    Points : 67
    Points
    67
    Par défaut
    Je suis sur un parser de .h
    je doit récupérer les variables,structures,enums,fonctions,defines etc...
    En ce qui concerne les structures et enums, je doit extraire imdépendament leur contenus, c'est a dire des variables. D'ou mon hash de hash!

    Même avec \%H_str, j'ai la même erreur : 0dd number of elements in hash assignment at ... lorsque que je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while ( my($str,%hash) = each(%H_str2) )
    ...
    Si un expert des expréssions régulière passe par ici :

    pour l'instant je fait des imbrications de if pour diférencié mes variable:
    - const <type> <nom>;
    - unsigned <type> <nom>;
    - <type> <nom>;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ligne =~ m/(const\sint|const\sfloat|const\s...char[\s\*]*)\s([*\w,]*);/
    (...) = premier module type de ma varible, const int - const char ...
    [\s\*]* = si présence d'un pointeur (*) dans le premier module char* - int* - char * ...
    ([*\w,]*) = deuxieme module, correspond au nom de la variable, nb - *nb - un_char ...

    j'ai essaye de mettre [const|unsigned\s]* mais ca ne fonctionnement pas
    je voudrais que lorsque la variable est déclarée en const ou unsigned je puisse récupérer ça dans mon premier module ($1) sans etre obligé de faire const\sint|const\s....

  4. #4
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Bonjour,

    Ce qu'il te faut bien saisir, c'est qu'une référence à un hash est de type scalaire et non pas hash... En gros, ce n'est pas comme en C ou un pointeur sur un int est un int*.
    Ensuite, que veux tu mettre dans ta première table de hachage ? Est ce bien des tableaux (ou plutôt des références vers des tableaux) ? Actuellement, c'est ce que ton code fait. Si c'est ça, voici comment y accéder :
    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
    my (%h1, %h2)
    while (...)
    {
       while (...)
       {
          %h1{"cle1"} = [$val1,$val2] #  <- ceci est une référence anonyme vers un tableau
       }
       %h2{"cle2"} = \%h1;
    }
     
    while ( my($str,$refhash) = each(%h2) )
    {
       #ici, $h2{str} = $refhash
       #Pour accéder aux éléments de $refhash : $refhash->{"cle1"}
       #$refhash->{"cle1"} est une référence vers un tableau !
       #Pour accéder aux éléments du tableau :  $refhash->{"cle1"}[0]
    }
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  5. #5
    Membre du Club Avatar de pymouse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 137
    Points : 67
    Points
    67
    Par défaut
    Dans ma premier hash un tableau anonyme c'est bien. Je veu juste enregistrer une définition de variable.

    par exemple:
    int nb;

    H_str{int\0nb}=[ int,nb ];

    la concaténation de int et nb me permet d'éviter les doublons de déclaration de variable (car je parcours plusieur .h)

    Donc si j'ai bien compris, une fois que j'ai référencé une hash, je ne peut pas récupérer une hash. Mais avec la référence je peut avoir un tableau des éléments?
    Pour l'affichage, il faut que je procede un peu comme je le fait dans le premier post, c'est a dire en affichant éléments par éléments. Comme je n'aurais jamais le même nombre de déclaration dans une structure ou enum, Peut-on boucler sur les élément du tableau? Ou passé par index, c'est a dire,si cela existe, get_nombre_delt($refhash);?

  6. #6
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Citation Envoyé par pymouse
    Donc si j'ai bien compris, une fois que j'ai référencé une hash, je ne peut pas récupérer une hash.
    Si, bien sûr. Suivant l'exemple que je t'ai donné, la table de hachage sera %$refash .

    Citation Envoyé par pymouse
    Peut-on boucler sur les élément du tableau? Ou passé par index, c'est a dire,si cela existe, get_nombre_delt($refhash);?
    Oui, comme je te l'ai montré. Suivante l'exemple que je t'ai donné, ton tableau s'appelle @{$refhash->{"cle1"}}.
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  7. #7
    Membre du Club Avatar de pymouse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 137
    Points : 67
    Points
    67
    Par défaut
    Okay,merci ça devient un peu plus clair

Discussions similaires

  1. Affichage d'une table de hachage
    Par chichi0703 dans le forum Débuter
    Réponses: 4
    Dernier message: 21/04/2015, 10h09
  2. affichage d'une table en javascript
    Par benkunz dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 16/11/2006, 18h33
  3. Affichage d'une table MySQL
    Par Paniez dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/07/2006, 14h09
  4. Réponses: 2
    Dernier message: 21/06/2006, 10h23
  5. Problème avec affichage d'une table modifiée
    Par auriolbeach dans le forum Access
    Réponses: 6
    Dernier message: 31/10/2005, 16h45

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