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 :

Parcours d'un hash de hash de hash


Sujet :

Langage Perl

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Parcours d'un hash de hash de hash
    Hello tlm,

    J'ai un tableau qui ressemble à ça :

    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
    %results = (
    	'000001' => {
    			1 => "A_val1",
    			2 => "A_val2",
    			3 => "A_val3",
    			4 => "A_val4",
    		},
    	'000002' => {
    			1 => "B_val1",
    			2 => "B_val2",
    			3 => "B_val3",
                            4 => { 'champ1'=>'12','champ2'=>'23'}
    			5 => "B_val5",
    		}
    );
    J'arrive à le parcourir et à reconnaitre le hash quand la variable en est un (par la fonction ref()) mais je n'arrive pas à parcourir le hash quand je le reconnais.

    J'ai tenté un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    foreach my $k (sort(keys(%results))){
        for ($p=0;$p<=99;$p++){
            if (ref( $results{$k}{$p} ) eq 'HASH'){
                 foreach my $val (keys %{$results{$k}{$p}}) {
                        print "[".$val." = ".${$results{$k}{$p}}{$val}."]<br />";
                }
            }
        }
    }
    mais le dernier foreach ne donne rien ... au pire une erreur.

    Comment que je fais ?


    Balises [ code ] et [ /code ] ajoutées par 2Eurocents.

  2. #2
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    En première approche, j'aurai eu tendance à pratiquer ainsi ...
    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
    #!/usr/bin/perl
     
    use warnings;
    use strict;
     
    my %results = (
       '000001' => {
             1 => "A_val1",
             2 => "A_val2",
             3 => "A_val3",
             4 => "A_val4",
          },
       '000002' => {
             1 => "B_val1",
             2 => "B_val2",
             3 => "B_val3",
             4 => { 'champ1'=>'12','champ2'=>'23'},
             5 => "B_val5",
          }
    );
     
    foreach my $k (sort(keys(%results))){
      print "Clef $k, valeur $results{$k}\n";
      foreach my $p (0..99) {
        if (exists ($results{$k}{$p})) {
          print "Indice $p, valeur $results{$k}{$p}\n";
          if (ref ($results{$k}{$p})) {
            my $ref = $results{$k}{$p};
            foreach my $val (keys (%{$results{$k}{$p}})) {
              print "Dernière clef $val, valeur $results{$k}{$p}{$val}\n";
            }
          }
        }
      }
    }
    Cela suppose que l'on sache ce qu'il y a derrière la référence ... je fais ici la supposition qu'il s'agit d'un Hash (puisque je suis au courant de la structure des données).

    Il faut se souvenir que le résultat de ref est un booléen : vrai, c'est une référence, ou faux, c'est un scalaire.

    Bonne continuation.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Je suis en train d'étudier ton code. Mais pour l'instant, ça ne va pas plus loin que la condition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
           if (ref ($results{$k}{$p}))
    Dans le cas où les boucles rencontrent un hash, l'affichage est le suivant (par ex). Mais il ne va pas plus loin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         Clef 0000001740, valeur HASH(0x8bb4d78)
    Je cherche, mais si tu vois comment faire, ton aide me serait précieuse

  4. #4
    Membre actif
    Inscrit en
    Février 2005
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 167
    Points : 203
    Points
    203
    Par défaut
    Bon, regardes si ceci t'apporte le bonheur :

    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
    #! /usr/local/bin/perl -w
     
    use strict;
     
    my %results = (
       '000001' => {
             1 => "A_val1",
             2 => "A_val2",
             3 => "A_val3",
             4 => "A_val4",
          },
       '000002' => {
             1 => "B_val1",
             2 => "B_val2",
             3 => "B_val3",
             4 => { 'champ1'=>'12','champ2'=>'23'},
             5 => "B_val5",
          }
    );
     
    for my $k( sort keys %results ) {
        print "$k\n";
        for my $l( sort keys %{$results{$k}} ) {
            if( ref $results{$k}{$l} ) {
                print "\t$l\n";
                for my $m( sort keys %{$results{$k}{$l}} ) {
                    print "\t\t$m\t$results{$k}{$l}{$m}\n";
                }
            }
            else {
                print "\t$l\t$results{$k}{$l}\n";
            }
        }
    }
    Par contre, si le niveau d'imbrication des hashes peut descendre à un niveau arbitrairement profond, il faut passer à une solution recursif.

    N

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci à tous les deux !

    En fait, l'erreur ne se situé par qu'à ce niveau mais aussi au niveau de la création du hash le plus profond. Bien entendu, ça ne fonctionnait pas car le tableau n'était pas rempli correctement.

    D'ailleurs, dans une boucle foreach, quelle est la différence entre appel de ce genre :

    et celui ci :

    C'est certainement la base, mais j'ai vu des textes donnant les deux formulations comme étant équivalentes alors que dans mon cas précis, la première formulation ne fonctionne pas (pour affecter la donnée dans une cellule d'un autre tableau)

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    En fin de compte, cela fonctionne comme tel. Le problème provenait de la construction du tableau qui passe dans la moulinette. Plus précisemment, je mettais des valeurs dans un tableau dont le nom était toujours le même qui était mis dans le tableau général. Ceci dans une boucle. Le problème, c'est que seul le tableau entré dans le super tableau était pris en compte et remplacer les valeurs dans l'ensemble de ce dernier .... qui a dit "pointeur" dans la salle ?

Discussions similaires

  1. Problème avec un hash de tableau de hash
    Par hy00ga dans le forum Langage
    Réponses: 1
    Dernier message: 21/10/2011, 15h10
  2. Static Hashed File et Dynamic Hashed File
    Par devparis2011 dans le forum Alimentation
    Réponses: 3
    Dernier message: 13/04/2011, 18h10
  3. [Prototype] [Hash] Pas de ordered hash dans prototype ?
    Par typedef dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 23/09/2010, 17h47
  4. Hash Semi Join VS Hash Join
    Par pacmann dans le forum SQL
    Réponses: 5
    Dernier message: 25/08/2008, 18h05
  5. [Mail] hash() : définir longueur du hash
    Par webrider dans le forum Langage
    Réponses: 5
    Dernier message: 17/08/2006, 14h58

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