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

Modules Perl Discussion :

Parsing de plusieurs fichiers xml, perte de données


Sujet :

Modules Perl

  1. #1
    N0A
    N0A est déconnecté
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Parsing de plusieurs fichiers xml, perte de données
    Bonjour,

    Voici mon problème :
    J'ai un programme en perl qui effectue une boucle sur plusieurs fichiers xml.
    Au début de ma boucle je déclare et initialise plusieurs variables qui contiendrons les valeurs que contient le fichier xml en cours.
    Je creér un XML:arser sur le fichier xml en cours.
    Le parsing du premier fichier s'effectue très bien ainsi que tout les traitements qui suivent. Mais lors du deuxième passage dans ma boucle, pour le traitement du deuxième fichier xml, mes variables s'initialisent bien, mais au moment du parsing, à la première balise, toutes les variables ont retrouvées les valeurs du premier fichier xml (truc incompréhensible). Je précise aussi que j'indéfinis mon parser à la fin de ma boucle. J'ai également essayer avec un parser différent pour chaque fichiers ( $parser[$i] ) mais rien ne change.
    J'espère que cette explication de mon problème est assez clair.
    Je voulais savoir si quelqu'un a déjà effectué un parsing sur plusieurs fichiers xml en perl et s'il a rencontré ce problème.
    Merci de votre aide.

  2. #2
    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
    Ce que tu racontes ressemble de façon suspecte à un problème de "closures" : déclares-tu à l'extérieur des sub {} des variables lexicales (my) que tu utilises dans les subs ?
    Si ce n'est pas ça, il est très difficile de répondre sans un exemple minimal de code (pas l'intégralité de ton script, juste quelque chose qui reproduit le comportement que tu décris).

    --
    Jedaï

  3. #3
    N0A
    N0A est déconnecté
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Oui, ce sont ces variables (my $...) qui retrouvnte leur valeur du premier passage de boucle bien que je l'ai ai initialise.
    Je les déclare au début de ma boucle et je les utilise dans plusieurs sous programmes( sub {...} ) qui se se trouve à l'intérieur de ma boucle. J'appelle ces variables des "variables globales".
    Qu'est-ce-un problème de closure?

  4. #4
    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
    Oui, je pense que c'est un problème de closures. Les closures sont une fonctionnalité intéressante implémentée dans Perl (et dans quelques autres langages) qui permet d'écrire des choses comme ça par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    {
      my $i = 0;
      sub iterator {
        i++;
      }
    }
     
    print iterator(); # '0'
    print iterator(); # '1'
    #etc
    Comme tu le vois, $i est invisible pour le reste du programme (à cause du 'my'), mais visible pour &iterator, mais comme elle est déclarée en dehors d'iterator, elle n'est pas redéclarée à chaque invocation d'iterator, elle conserve donc sa valeur d'un appel à l'autre. Ca peut être très pratique comme tu peux sans doute l'imaginer. On dit que iterator est une closure, et donc se rappelle de son contexte lors de sa déclaration.

    Mais à cause de cela il y a un petit piège :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (1..4){
      my $i = $_;
      sub print_i  {
        print $i, " ";
      }
      print_i();
    }
    Que penses-tu que cela écrive ?
    Si tu essaies ce programme, tu t'apercevras que cela écrit "1 1 1 1 "...
    Pourquoi ? Parce que pour une sub nommée, la création ne se fait qu'une fois, même si on repasse plusieurs fois par la section de code où se trouve sa déclaration comme ici. print_i est donc déclarée une fois au premier passage dans la boucle, dans un contexte où $i est une variable lexicale qui vaut 1, comme $i est utilisée dans print_i, print_i devient une closure et donc "cristallise" son contexte.
    Au deuxième passage dans la boucle, on n'est plus dans la même portée qu'au premier passage, et on redéclare une variable lexicale $i, différente de la première ! Si print_i était alors recréé tout irait bien, mais comme ce n'est pas le cas, quand on appelle print_i, il réutilise la valeur du premier $i, qui n'est plus le $i de la boucle actuelle...


    Pour ce qui est de ton problème, je pense qu'il est de cette nature, pour le régler, déclare les variables que tu utilises dans tes sub comme des vraies variables globales (avec 'our', 'my' déclare en effet une variable lexicale, c'est à dire invisible en-dehors de la portée où elle est déclarée).
    Tu peux aussi passer explicitement ces variables à chaque appel de tes sub.
    (Tu pourrais aussi faire de tes sub nommées des sub anonymes car elles sont redéclarée à chaque passage par leur déclaration, mais ce serait du gaspillage)

    --
    Jedaï

Discussions similaires

  1. Fusionner les données de plusieurs fichiers XML
    Par forst dans le forum jQuery
    Réponses: 4
    Dernier message: 26/08/2013, 14h43
  2. Réponses: 1
    Dernier message: 25/03/2013, 15h01
  3. [XL-2002] convertir des données d'un fichier excel en plusieurs fichiers XML
    Par 19chacha75 dans le forum Excel
    Réponses: 2
    Dernier message: 06/01/2011, 15h53
  4. [XSL]récupérer une valeur de plusieurs fichiers XML
    Par snoop dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 05/02/2006, 00h32
  5. [DOM] Erreur lors du parsing d'un fichier XML par l'API DOM
    Par patricetoan dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 26/09/2005, 12h43

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