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 :

structure de données, comment la parser ?


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur Systèmes
    Inscrit en
    Août 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Monaco

    Informations professionnelles :
    Activité : Ingénieur Systèmes
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 75
    Points : 87
    Points
    87
    Par défaut structure de données, comment la parser ?
    bonjour,

    je vous contacte car je n'arrive pas à faire un truc qui est à priori simple, j'ai du louper un épisode sur les hash de hashs de arrays de hashs.. & co..

    Comment puis-je accéder au contenu de cette structure (provient data::dumper) :

    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
     
    $VAR1 = {
              'db_conn_ora' => [
                               {
                                 'password' => 'xxxxxxxxx',
                                 'criticity' => '1',
                                 'description' => 'database connection',
                                 'port' => '15210',
                                 'username' => 'toto',
                                 'host' => 'hostmachinchose'
                               }
                             ],
              'ping' => [
                        {
                          'criticity' => '1',
                          'description' => 'Appserver Nodes availability',
                          'host' => 'hostici'
                        }
                      ],
              'TCP_Port' => [
                            {
                              'criticity' => '1',
                              'description' => 'RMI Port',
                              'port' => '40598',
                              'host' => 'hostla'
                            },
                            {
                              'criticity' => '1',
                              'description' => 'Oracle listener',
                              'port' => '1521',
                              'host' => 'hostoracleici'
                            }
                          ]
            };
    pour l'instant j'ai testé un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    foreach my $mcheck (@{$data->{checks}}) {
      foreach my $check (keys %{ $mcheck }) {
        print "$check\n";
      }
    }
    et cela m'affiche bien le nom du check (ping, db_conn_ora ou TCP_Port), mais comment puis-je accéder aux sous valeurs ?

    globalement, j'aimerais faire une boucle, pour chaque type de check trouvé, chopper les valeurs du dessous.

    si vous voulez plus d'infos et que cela vous aide, je lis un XML avec XML::Simple 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    <?xml version="1.0" encoding="UTF-8"?>
     
      <morningcheck>
         <application>XXXX</application>
         <environment>UAT</environment>
         <checks>
     
               <ping
                  criticity="1"
                  description="Appserver Nodes availability"
                  host="hostici" />
     
               <TCP_Port
                  criticity="1"
                  description="RMI Port"
                  host="hostmachinchose"
                  port="40598" />
     
               <TCP_Port
                  criticity="1"
                  description="Oracle listener "
                  host="hostoracleici"
                  port="1521" />
     
               <db_conn_ora
                  criticity="1"
                  description="atabase connection"
                  host="hostmachinchose"
                  port="1521"
                  username="userici"
                  password="xxxxxxxxx" />
     
         </checks>
      </morningcheck>
    merci encore de vos lumières

    en gros j'aimerais boucler sur les checks, en disant "pour chaque check trouvé (il peut y avoir plusieurs checks de chaque type, exemple plusieurs "ping" ou "tcp_port", ) alors fait telle et telle action avec les valeurs que tu trouves dedans, mais je n'arrive pas à récupérer les valeurs.

    j'ai du mal avec ce concept de hash qui contient de l'array qui contient du hash etc..

    merci !

  2. #2
    Membre régulier
    Homme Profil pro
    Ingénieur Systèmes
    Inscrit en
    Août 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Monaco

    Informations professionnelles :
    Activité : Ingénieur Systèmes
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 75
    Points : 87
    Points
    87
    Par défaut
    en faisant un peu joujou j'ai réussi à imprimer des valeurs, complètement au pif, avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach my $mcheck (@{$data->{checks}}) {
      foreach my $val (values %{ $mcheck }) {
        foreach my $ar (@{$val}) {
          foreach my $foo (values %{ $ar }) {
            print "$foo\n";
          }
        }
      }
    }
    mais je suis pas certain que ça soit l'idéal ?
    et surtout, comment jouer avec les clefs ?

    je voudrais faire des conditions du genre : if ($check = 'ping') { commandes }, if ($check = 'tcp_port { commandes } etc..

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Si tu veux à la fois les clés et les valeurs, tu dois boucler sur les clés, et récupérer les valeurs par déréférencement :

    Quelque chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    foreach my $mcheck (@{$data->{checks}}) {
      foreach my $check (keys %{ $mcheck }) {
        my $val = $data->{checks}->{$check};
        foreach my $ar (@{$val}) {
          foreach my $foo (values %{ $ar }) {
            print "$foo\n";
          }
        }
      }
    }
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur Systèmes
    Inscrit en
    Août 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Monaco

    Informations professionnelles :
    Activité : Ingénieur Systèmes
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 75
    Points : 87
    Points
    87
    Par défaut
    merci pour ta réponse, et c'est ce que j'essaye de faire mais ça veut pas

    (cf pour ton code j'ai un Not a HASH reference at ./mcapi.pl line 80 pour la ligne my $val = $data->{checks}->{$check}

    vraiment galère ces trucs :-(

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Je n'avais pas étudié en détail ta structure de donnée... il y a un "tableau" avant le hash car certaines "balises" (TCP_port par exemple) peuvent être présentent plusieurs fois : il te faut donc boucler sur ces différentes instances :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    foreach my $mcheck (@{$data->{checks}}) {
      foreach my $check (keys %{ $mcheck }) {
        my $i = 0;
        for my $ar (@{$data->{checks}->{$check}}) {
          foreach my $key (keys %{ $ar }) {
            my $foo = $ar->{$key};
            print "data->{checks}->{$check}->[$i]->{$key} = $foo\n";
            $i++;
          }
        }
      }
    }
    L'usage de $i n'est là que pour le print, il n'est pas utile à la boucle.
    Je n'ai pas testé.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur Systèmes
    Inscrit en
    Août 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Monaco

    Informations professionnelles :
    Activité : Ingénieur Systèmes
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 75
    Points : 87
    Points
    87
    Par défaut
    merci de ton aide,
    en fait ça ne marche pas le keys sur $mcheck, j'ai l'erreur :

    Can't use string ("db_conn_ora") as an ARRAY ref while "strict refs" in use at ./mcapi.pl line 68.

    mais grâce à ton aide j'ai fait fonctionné le truc avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    foreach my $mcheck (@{$data->{checks}}) {
      # print ici a faire
      foreach my $check (values %{ $mcheck }) {
        foreach my $ar (@{$check}) {
          print "-----------------------------------------------\n";
          foreach my $key (keys %{ $ar }) {
            print "key : $key\n";
            print "val : " . $ar->{$key} . "\n";
          }
        }
      }
    }
    en revanche, j'aimerais printer le type de check, juste après la première ligne, et je n'y arrive pas non plus (là ou j'ai mis le # print ici a faire) afin de faire une condition dessus si le check est d'un certain type etc.

  7. #7
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bonjour,
    Je me suis amusé en souvenir du bon temps avec Oracle
    et surtout pour réviser tableaux et hash

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #!/usr/bin/perl
    use strict;
    use warnings;
    use utf8;
    use Data::Dumper;
     
    my $VAR1 = {
              'db_conn_ora' => [
                               {
                                 'password' => 'xxxxxxxxx',
                                 'criticity' => '1',
                                 'description' => 'database connection',
                                 'port' => '15210',
                                 'username' => 'toto',
                                 'host' => 'hostmachinchose'
                               }
                             ],
              'ping' => [
                        {
                          'criticity' => '1',
                          'description' => 'Appserver Nodes availability',
                          'host' => 'hostici'
                        }
                      ],
              'TCP_Port' => [
                            {
                              'criticity' => '1',
                              'description' => 'RMI Port',
                              'port' => '40598',
                              'host' => 'hostla'
                            },
                            {
                              'criticity' => '1',
                              'description' => 'Oracle listener',
                              'port' => '1521',
                              'host' => 'hostoracleici'
                            }
                          ]
            };
     
    print Dumper($VAR1);
    print "\n\n";
     
    foreach my $mcheck ($VAR1) {
    	foreach my $data (keys(%$mcheck)) {
    		print "\n$data\n";
    		foreach my $hash (@{$mcheck->{$data}}) {
    			foreach my $k (keys(%$hash)) {
    				printf "%12s : %s\n", $k, $hash->{$k};
    			}
    			print "\n";
    		}
    	}
    }
     
    # La structure pointe sur un hash
    # Chaque valeur du hash contient un ou plusieurs tableaux
    # Chaque tableau contient à son tour un hash

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par frenchlion Voir le message
    merci de ton aide,
    en fait ça ne marche pas le keys sur $mcheck, j'ai l'erreur :

    Can't use string ("db_conn_ora") as an ARRAY ref while "strict refs" in use at ./mcapi.pl line 68.
    Je pense que tu n'as pas mis la structure depuis la racine, ce qui ne me permettait pas de donner le bon code. Si l'on veut pouvoir tester, il faudrait que tu donnes le contenu de la structure depuis la racine.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  9. #9
    Membre régulier
    Homme Profil pro
    Ingénieur Systèmes
    Inscrit en
    Août 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Monaco

    Informations professionnelles :
    Activité : Ingénieur Systèmes
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 75
    Points : 87
    Points
    87
    Par défaut
    effectivement désolé philou

    @dmganges : excellent merci encore !
    je vais aller lire de la doc là dessus, ça me paraît pas sorcier, j'imagine qu'avec un peu de lecture ça va rentrer tout seul merci encore !

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

Discussions similaires

  1. Comment rendre générique la structure de données d'un ListView ?
    Par altropus dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 12/12/2009, 10h14
  2. Réponses: 2
    Dernier message: 10/11/2009, 08h43
  3. comment connaitre une structure de donnée
    Par falifalibe2 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 09/10/2009, 14h30
  4. Réponses: 12
    Dernier message: 16/10/2008, 11h17
  5. Comment créer une structure de donnée dynamiquement ?
    Par Beaunico dans le forum Langage
    Réponses: 9
    Dernier message: 24/01/2006, 09h34

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