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 :

Stockage des hashs


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 4
    Points
    4
    Par défaut Stockage des hashs
    Bonjour tout le monde,

    Je suis débutant en Perl, et je dois faire un script Perl qui permet de lire des balises bien déterminées à partir d'un fichier XML.
    Pour cela, j'ai utilisé la libraire Twig et j'ai fait la lecture de toutes les balises.

    Fichier XML:
    <?xml version="1.0" encoding="UTF-8"?>
    <Root>
    <FRAMELIST>
    <FRAME>
    <PARAMETERLIST>
    <PARAMETER>
    <p_name>PPP</p_name>
    <p_code>454</p_code>
    </PARAMETER>
    <PARAMETER>
    <p_name>CCC</p_name>
    <p_code>789</p_code>
    </PARAMETER>
    </PARAMETERLIST>
    <f_Name>TTT</f_Name>
    <f_id>888</f_id>
    </FRAME>
    <FRAME>
    <PARAMETERLIST>
    <PARAMETER>
    <p_name>OOO</p_name>
    <p_code>356</p_code>
    </PARAMETER>
    <PARAMETER>
    <p_name>III</p_name>
    <p_code>147</p_code>
    </PARAMETER>
    </PARAMETERLIST>
    <f_Name>AAA</f_Name>
    <f_id>999</f_id>
    </FRAME>
    <FRAME>
    <PARAMETERLIST>
    <PARAMETER>
    <p_name>NNN</p_name>
    <p_code>757</p_code>
    </PARAMETER>
    <PARAMETER>
    <p_name>MMM</p_name>
    <p_code>896</p_code>
    </PARAMETER>
    </PARAMETERLIST>
    <f_Name>LLL</f_Name>
    <f_id>000</f_id>
    </FRAME>
    </FRAMELIST>
    </Root>

    Dans le fichier XML, on trouve une liste de trames qui ont chacune un nom, un id et une liste de paramètres qui ont chacun un nom et un code.

    1- Aprés l'extraction de ces informations, je voulais stocker chaque trame dans une table de hashage. Cette table doit contenir le nom, l'id et les paramètres de la trame. Mais les paramètres ont aussi des noms et des codes. Comment faire un hash de hash ?
    2- Aprés la création des tables de hash, je dois les enregistrer pour s'en servir ultérieurement. Est ce que je peux enregistrer une liste des tables de hash dans un tableau (ou autre) ?

    Merci Beaucoup d'avance

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Pas de réponses !!!

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Bonsoir,

    La moindre des choses est de montrer un XML indenté et de montrer ton code.

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonsoir,
    Citation Envoyé par djibril Voir le message
    La moindre des choses est de montrer un XML indenté et de montrer ton code.
    ++

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Bonsoir,

    fichier XML:
    Code xml : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <Root>
        <FRAMELIST>
            <FRAME>
                <PARAMETERLIST>
                    <PARAMETER>
                        <p_name>PPP</p_name>
                        <p_code>454</p_code>
                    </PARAMETER>
                    <PARAMETER>
                        <p_name>CCC</p_name>
                        <p_code>789</p_code>
                    </PARAMETER>
                </PARAMETERLIST>
                <f_Name>TTT</f_Name>
                <f_id>888</f_id>
            </FRAME>
            <FRAME>
                <PARAMETERLIST>
                    <PARAMETER>
                        <p_name>OOO</p_name>
                        <p_code>356</p_code>
                    </PARAMETER>
                    <PARAMETER>
                        <p_name>III</p_name>
                        <p_code>147</p_code>
                    </PARAMETER>
                </PARAMETERLIST>
                <f_Name>AAA</f_Name>
                <f_id>999</f_id>
            </FRAME>
            <FRAME>
                <PARAMETERLIST>
                    <PARAMETER>
                        <p_name>NNN</p_name>
                        <p_code>757</p_code>
                    </PARAMETER>
                    <PARAMETER>
                        <p_name>MMM</p_name>
                        <p_code>896</p_code>
                    </PARAMETER>
                </PARAMETERLIST>
                <f_Name>LLL</f_Name>
                <f_id>000</f_id>
            </FRAME>
        </FRAMELIST>
    </Root>

    Code:
    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
       # Input file parse
       my $InputFile = XML::Twig->new();
       $InputFile->parsefile($PathInFile);
     
       # Extracting Frame characteristics
       my $framelist = $InputFile->root->first_child('FRAMELIST');
       my @frames = $framelist->children('FRAME');
     
       my $ID;
       my $FName;
       my $code;
       my $PName;
     
       foreach my $frame(@frames)
       {
          $ID = $frame->field('f_id');
          $FName = $frame->field('f_Name');
     
          my $Parameterlist = $frame->first_child('PARAMETERLIST');
          my @Parameters = $Parameterlist->children('PARAMETER');
          foreach my $Parameter(@Parameters)
          {
             $code = $Parameter->field('p_code');
             $PName = $Parameter->field('p_name');
          }
       }

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Bonjour,

    C'est bien d'avoir déposé un fichier indenté.
    Le choix de l'utilisation du module XML::Twig est bien.

    Par contre, il est important de savoir ce que tu souhaites vraiment faire des données.
    Mettre tout le XML dans des hash revient à stocker entièrement en mémoire tout le ou les XML. Ce qui peut être néfaste à ton programme et tu perds l'avantage de l'utilisation du module.
    Avec le module, tu pourrais directement lancer des traitements sur chaque trame (balise FRAME).

    Donc réfléchi bien à ton besoin. De plus, est-ce que chaque trame a un nom unique dans ton XML ? Pour chaque trame, est-ce que les noms de paramètre sont uniques ?

    Actuellement, ton XML semble basique et si tu tiens vraiment à mettre tout en mémoire (ce que je déconseille), tu peux utiliser le module XML::Simple qui le fera pour toi.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Merci BCP djibril pour la réponse.

    Oui, chaque trame a un nom unique dans le fichier XML, et pour chaque trame, les noms des paramètres sont uniques.

    En fait, avec les caractéristiques des trames (et des paramètres), je dois générer des fichiers de code en C.
    Quelques fichiers nécessitent les caractéristiques d'une seule trame, d'autres nécessitent les caractéristiques de toutes les trames présentes dans le fichier XML. C'est pour cette raison que j'ai pensé à stocker tout le fichier XML.

    Avec le module Twig, comment je pourrais directement lancer des traitements sur chaque trame ?

    Merci BCP d'avance

  8. #8
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Pour parser le fichier morceau par morceau, on utilise Twig_handlers.
    Voici un exemple de bout de programme :
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use XML::Twig;
     
    my $FichierXML = 'ExempleXML.xml';
    # Parsing façon intelligente en ne chargeant que le strict nécessaire en mémoire
    # Utilisation des handlers
    my $twig = new XML::Twig( 
    	Twig_handlers => { 
    		'FRAME' => \&traitement_frame, 
    	}, 
    );
    $twig->parsefile($FichierXML);
     
    sub traitement_frame {
    	my ( $twig, $TwigFrame ) = @_;
    	# Traitement
    }
    Tu peux lire mon article : http://djibril.developpez.com/tutoriels/perl/perl-xml/

    Le module offre beaucoup de possibilités. C'est à toi d'avoir un algorithme qui a du sens.

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Merci Djibril pour la réponse

    Je vais lire ton article et voir l'utilisation de Twig_handlers.

  10. #10
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par FRANCO0211 Voir le message
    Dans le fichier XML, on trouve une liste de trames qui ont chacune un nom, un id et une liste de paramètres qui ont chacun un nom et un code.

    1- Aprés l'extraction de ces informations, je voulais stocker chaque trame dans une table de hashage. Cette table doit contenir le nom, l'id et les paramètres de la trame. Mais les paramètres ont aussi des noms et des codes. Comment faire un hash de hash ?
    2- Aprés la création des tables de hash, je dois les enregistrer pour s'en servir ultérieurement. Est ce que je peux enregistrer une liste des tables de hash dans un tableau (ou autre) ?
    Je ne comprends pas bien ce que tu veux faire avec tes données, mais voici une des façons possibles de faire un hash de hashes dans un cas un peu général (en supposant que les variables $frame_name, $frame_id, $param_name et $param_code ont été précédemment déclarées et alimentées et en supposant que l'ID de la trame doit être la clé de la table de hachage globale et le nom des paramètres la clef des sous-table de hachage):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    my %hash;
    # ...
    foreach ... {
         # ... recherche des éléments d'une trame
         $hash{$frame_id}{nom} = $frame_name;
         foreach ... {
              # ...
               $hash{$frame_id}{$param_name} = $param_code;
         }
    }
    Je ne suis pas sûr que ce soit exactement la structure que tu désires obtenir, mais au moins ça doit te donner la syntaxe.

    Cela implique, comma l'a dit Djibril, que les identifiants de trames soient uniques et que, dans chaque trame, les noms de paramètre soient uniques.

    Ensuite pour mettre le hash constitué dans un tableau (question 2):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my @global_array;
    # ...
    push @global_array, \%hash;
    La syntaxe \%hash crée une référence vers ton hash (c'est à dire un scalaire pointant vers le hash), si bien que le tableau @global_array est un tableau de références vers des hashes.

    Il serait possible d'écrire directement des références vers des hashes anonymes dans le tableau, mais il est sans doute préférable pour un débutant de décomposer l'opération en deux temps comme ci-dessus, c'est sans doute plus facile à comprendre et moins sujet à erreur.

    A noter que je n'ai pas du tout testé ce qui précède, il a pu se glisser une erreur ou une faute de frappe passée inaperçue.

    Edit: je n'avais pas vu les trois derniers posts (#7, #8 et #9) quand j'ai commencé à rédiger ce message, je vois que tu as répondu entre temps sur l'unicité des clefs. De plus , il semble que tu veuilles utiliser le nom de la trame comme clef de ton hash, il suffit de changer les lignes de code concernées comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $hash{$frame_name}{id} = $frame_id;
    et:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $hash{$frame_name}{$param_name} = $param_code;

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Merci BCP Lolo78,

    Je vais essayer tout ça

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

Discussions similaires

  1. stockage des messages avec thunderbird
    Par jackk dans le forum Thunderbird
    Réponses: 5
    Dernier message: 08/03/2009, 11h15
  2. Stockage des sessions
    Par GregPeck dans le forum Langage
    Réponses: 6
    Dernier message: 21/02/2006, 14h38
  3. tables sys + stockage des contraintes
    Par XtofRoland dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 31/01/2006, 09h39
  4. [MySQL] Problème par rapport au tutoriel sur le stockage des images en base
    Par dark_vidor dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/09/2005, 10h37
  5. [Preferences] Stockage des options
    Par Yan83 dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 03/05/2004, 10h38

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