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 :

Liste thématique xml


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Points : 25
    Points
    25
    Par défaut Liste thématique xml
    Bonjour,

    je cherche à faire une recherche thématique dans un texte à l'aide d'un script PERL. Je m'explique :

    en input :

    un fichier XML : <titrelivre>bla bla...</titrelivre><resumelivre>Oui-oui se promenait dans sa voiture rouge et jaune. [...]</resumelivre>

    en ressource externe :

    une liste de mot (un mot/ligne) sur le thème de l'automobile :

    voiture
    volant
    roue
    [...]

    en résultat :

    un fichier XML : <titrelivre>bla bla...</titrelivre><resumelivre>Oui-oui se promenait dans sa <theme>voiture</theme> rouge et jaune. [...]</resumelivre><mots-theme>voiture, [...], [...]</mots-theme>


    Pour résumer je souhaiterai rajouter la balise <theme> quand on retrouve dans le texte un mot de la liste thématique mais aussi que les mots retrouvés à partir de la liste thématique soit insérés dans le fichier XML séparés par une virgule.

    Je suis novice en PERL et je ne sais par où commencer.

    Merci d'avance de votre aide.

  2. #2
    Membre du Club
    Homme Profil pro
    BioInformaticien
    Inscrit en
    Décembre 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BioInformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 49
    Points : 63
    Points
    63
    Par défaut
    Bonjour,

    Si tu ne connais pas bien perl, tu devrais jeter un oeil au tuto de Sylvain Lhullier qui t'expliquera très bien les fonctions dont je vais te parler (un autre tuto de ton choix sera aussi surement très bien )

    1- Mets dans une hash ou un tableau tes mots thématiques

    2- Lis ton fichier XML ligne par ligne. A chaque ligne tu feras une succession d'étapes:

    -Dans une boucle foreach, cherches tous tes mots clés($theme) dans la ligne courante. Pour chercher ces mots clés, tu peux faire une expression régulière qui remplacera automatiquement la variable $theme par <theme>$theme</theme>.

    -Ta recherches te servira aussi de test. S'il est positif (c'est à dire que tu as effectivement trouvé le mot $theme), stockes ton mot thème dans un tableau, ou directement sous forme d'une variable de type string ($currentThemes).

    Quand ta boucle foreach est termignée, concatène ta ligne avec ta balise <mots-theme>$currentThemes</mots-theme>

    C'est un algorithme très général je te laisse chercher un peu pour le détail du code

  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
    Pour commencer, choisis-toi un parseur XML (un parseur DOM sera pratique pour modifier la structure par la suite, XML::DOM par exemple).

    Ensuite, parcours lis ton fichier de theme et stocke les informations dans un hash, comme ceci par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    open my $THEME, "<", "themes.txt" or die "Can't ope, themes.txt for reading: $!";
    my %theme = map { chomp; $_ => 1 } <$THEME>;
    Ensuite, à l'aide du parseur, parcours tous les tags <resumelivre> et pour chacun, applique une modification à l'aide, par exemple, d'une expression régulière de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my @mots_theme = ();
    $resume =~ s{\b(\w+)\b}{exists $theme{$1} ? (push @mots_theme, $1, "<theme>$1</theme>") : $1}ge;
    Puis après chaque tag <resumelivre>, tu y ajoutes un frère <mots-theme> dont le contenu sera constitué ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $mots_theme = join ",", @mots_theme;
    Voila, il ne te reste plus qu'à mettre un peu de glue entre tout ça, et peut-être te poser les bonnes questions sur la portée de @mots_theme.

    Cordialement.
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Points : 25
    Points
    25
    Par défaut
    Merci à vous deux pour vos réponses.

    Alors j'ai bien réussi à faire quelques brides du script en combinant vos deux réponses. Mais la chose que je n'arrive pas à comprendre et la lecture du fichier XML. J'ai bien lu en détail le tutoriel sur Perl et les fichiers XML mais rien n'y fait, je n'arrive pas trouver le code qui lis mon fichier xml ligne par ligne et qui lorsqu'il rencontre le tag <resumelivre> il modifie ce que je veux.

    J'avais trouvé le script ParseurXMLSimple ici :

    http://djibril.developpez.com/tutori.../perl-xml/#LVI

    mais je ne comprends plus rien à partir du commentaire Procédures.

    La glue ne veut peut adhérer avec moi

  5. #5
    Membre du Club
    Homme Profil pro
    BioInformaticien
    Inscrit en
    Décembre 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BioInformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 49
    Points : 63
    Points
    63
    Par défaut
    N'hésite pas a montrer ton avancée qu'on puisse t'indiquer quoi faire

    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    open(XmlFile,"chemin/vers/xml") or die("open: $!");
    while( defined( $line = <XmlFile> ) ) {	#Fais défiler les lignes une par une dans la variable $line
    	foreach my $theme (@AllThemes){
    		$line =~ s/$theme/<theme>$theme<\/theme>/g;	#ajoute les balises theme ; 
    		print $line;	#pour vérifier que tu as bien ce que tu cherches
    	}
    }

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Points : 25
    Points
    25
    Par défaut
    Voici où j'en suis dans mon script :

    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
    #! /usr/bin/perl
    use strict;
    use warnings;
    use XML::Simple;
     
     
    #Liste de themes dans un hash
    open my $THEME, "<", "themes.txt" or die "Can't open themes.txt for reading: $!";
    my %theme = map { chomp; $_ => 1 } <$THEME>;
     
    my $xml = new XML::Simple;
     
    #Lecture du fichier xml ligne par ligne
    my $data = $xml->XMLin('exempleXML.xml');
     
    my @mots_theme = ();
     
    foreach my $abstract ( @{$data->{resumelivre}})
    $abstract =~ s{\b(\w+)\b}{exists $theme{$1} ? (push @mots_theme, $1, "<theme>$1</theme>") : $1}ge;
     
    #Ajout d'un frère à <resumelivre>
     
    #Contenu de mots_theme
    my $mots_theme = join ",", @mots_theme;


    Encore merci.

  7. #7
    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
    Il faut que tu mettes des accolades autour des opérations de ton foreach.

    Sinon, je suppose que @{$data->{resumelivre}} ne va pas convenir pour parcourir tous les élément resumelivre, mais je peux me tromper, je ne connais pas bien le module XML::Simple.
    A ta place, je partirais en mode debug pour découvrir comment est structuré $data et le parcourir convenablement (ou je lirais la doc en profondeur).
    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

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Points : 25
    Points
    25
    Par défaut
    Euh c'est quoi en mode debug ? Je n'ai toujours aucun résultat

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Points : 25
    Points
    25
    Par défaut
    Je viens de tester

    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
    #! /usr/bin/perl
    use strict;
    use warnings;
    use XML::Simple;
     
     
    #Liste de themes dans un hash
    open my $THEME, "<", "themes.txt" or die "Can't open themes.txt for reading: $!";
    my %theme = map { chomp; $_ => 1 } <$THEME>;
     
    my $xml = new XML::Simple;
     
    #Lecture du fichier xml ligne par ligne
    my $data = $xml->XMLin('exempleXML.xml');
     
    my @mots_theme = ();
     
     
    while( defined(my $line = <data> ) ) {	#Fais défiler les lignes une par une dans la variable $line
    	foreach my $theme (@mots_theme){
    		$line =~ s/$theme/<theme>$theme<\/theme>/g;	#ajoute les balises theme ; 
    		print $line;	#pour vérifier que tu as bien ce que tu cherches
    	}
    }
    qui me génère comme erreur :

    Name "main::data" used only once: possible typo at scripttest.pl line 20.
    could not find ParserDetails.ini in /usr/lib/perl5/vendor_perl/5.14/XML/SAX
    readline() on unopened filehandle data at scripttest.pl line 20.

  10. #10
    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
    Il faut que tu lises la doc de XML::Simple pour comprendre comment l'utiliser. Notamment, $data qui est retourné par XMLin ne renvoie pas un "File Handle", mais une structure de donnée correspondant au fichier XML lu.

    Le mode debug, c'est quand tu appelles le script avec "perl -d", ce qui lance le debugger perl, dont l'aide se trouve ici (perldoc perldebug pour la doc à jour en anglais).
    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

  11. #11
    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 morphemia Voir le message
    Euh c'est quoi en mode debug ? Je n'ai toujours aucun résultat
    Tu lances ton script avec une commande du type:

    Cela te permet ensuite d'exécuter le programme ligne par ligne et de regarder le contenu des variables au fur et à mesure.

    Immédiatement après la commande ci-dessus, la commande "h" te donnera de l'aide sur les différentes commandes possibles:

    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
      DB<1> h
    List/search source lines:               Control script execution:
      l [ln|sub]  List source code            T           Stack trace
      - or .      List previous/current line  s [expr]    Single step [in expr]
      v [line]    View around line            n [expr]    Next, steps over subs
      f filename  View source in file         <CR/Enter>  Repeat last n or s
      /pattern/ ?patt?   Search forw/backw    r           Return from subroutine
      M           Show module versions        c [ln|sub]  Continue until position
    Debugger controls:                        L           List break/watch/actions
      o [...]     Set debugger options        t [expr]    Toggle trace [trace expr]
      <[<]|{[{]|>[>] [cmd] Do pre/post-prompt b [ln|event|sub] [cnd] Set breakpoint
      ! [N|pat]   Redo a previous command     B ln|*      Delete a/all breakpoints
      H [-num]    Display last num commands   a [ln] cmd  Do cmd before line
      = [a val]   Define/list an alias        A ln|*      Delete a/all actions
      h [db_cmd]  Get help on command         w expr      Add a watch expression
      h h         Complete help page          W expr|*    Delete a/all watch exprs
      |[|]db_cmd  Send output to pager        ![!] syscmd Run cmd in a subprocess
      q or ^D     Quit                        R           Attempt a restart
    Data Examination:     expr     Execute perl code, also see: s,n,t expr
      x|m expr       Evals expr in list context, dumps the result or lists methods.
      p expr         Print expression (uses script's current package).
      S [[!]pat]     List subroutine names [not] matching pattern
      V [Pk [Vars]]  List Variables in Package.  Vars can be ~pattern or !pattern.
      X [Vars]       Same as "V current_package [Vars]".
      y [n [Vars]]   List lexicals in higher scope <n>.  Vars same as V.
    For more help, type h cmd_letter, or run man perldebug for all docs.
    Mais le debug ne fonctionne que si ton programme compile correctement, il faut donc commencer par éliminer les erreurs de compilation.

    EDIT: oups, je n'avais pas vu la réponse de Philou.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Points : 25
    Points
    25
    Par défaut
    Désolée de ce manque de nouvelles mais mon ordinateur m'a lâché la semaine dernière. Je suis toujours au même point, je comprends la logique de l'algo mais je n'ai pas assez de connaissances en Perl pour tout coordonner.

    Je me suis retirée une contrainte, je ne suis pas obligée de lire ce qu'il se trouve uniquement entre les balises <titrelivre> et <resumelivre>.

    Encore merci de vos aides si précieuses.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Points : 25
    Points
    25
    Par défaut
    Voilà où j'en suis :

    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
    #! /usr/bin/perl
    use strict;
    use locale;
     
    #Liste de themes dans un hash
    open my $THEME, "<", "themes.txt" or die "Can't open themes.txt for reading: $!";
    my %theme = map { chomp; $_ => 1 } <$THEME>;
    open my $FICHIER, "<", "exempleXML.xml" or die "Can't open exempleXML.xml for reading: $!";
     
     
     
     
    while( my $line = <FICHIER> ) {	#Fais défiler les lignes une par une dans la variable $line
    	chomp $line;
    	my @mots_theme = ();
    	foreach my $theme (@mots_theme){
    		$line =~ s/$theme/<theme>$theme<\/theme>/g;	#ajoute les balises theme
    		print $line;	#pour vérifier que tu as bien ce que tu cherches
    	}
    }
    En sortie, j'obtiens un fichier vide. J'ai essayé de supprimer la ligne 17, ce qui devrait m'afficher au moins les lignes du fichier, la sortie reste toujours un fichier vide. Je ne trouve pas mon erreur.

    Merci d'avance de votre aide.

  14. #14
    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
    Bonjour,

    L'erreur est ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my @mots_theme = ();
    	foreach my $theme (@mots_theme){
    Le tableau @mots_theme est vide parce qu'il vient d'être créé.

    Tu entres dans le code du foreach pour chaque valeur du tableau @mots_theme, mais comme ce tableau est vide, tu ne rentres jamais dans la boucle foreach et, par voie de conséquence n'imprimes rien.

    La logique serait sans doute d'avoir quelque chose comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $theme (values %theme){

  15. #15
    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
    Pense aussi à fournir des exemples de fichier d'entrée... ça aide pour t'aider.
    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

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Points : 25
    Points
    25
    Par défaut
    Voici mon dernier test :

    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
    #! /usr/bin/perl
    use strict;
    use locale;
     
    #Liste de themes dans un hash
    open my $theme, "<", "listetest.txt" or die "Can't open themes.txt for reading: $!";
    my %theme = map { chomp; $_ => 1 } <$theme>;
     
    #open my $FICHIER, "<", "corpustest.txt" or die "Can't open corpustest.txt for reading: $!";
     
     
     
    while( my $line = <STDIN> ) {	#Fais défiler les lignes une par une dans la variable $line
    	chomp $line;
    #	my @mots_theme = ();
    	foreach my $theme (values %theme){
    		$line =~ s/$theme/<theme>$theme<\/theme>/g;	#ajoute les balises theme
    		print $line;	#pour vérifier que tu as bien ce que tu cherches
    	}
    }
    Je suis passée en STDIN car j'ai remarqué qu'il me sortait un fichier vide quand je faisais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open my $FICHIER, "<", "corpustest.txt" or die "Can't open corpustest.txt for reading: $!";
    Pour faire simple, j'ai testé sur ce corpus (=corpustest.txt) :

    la voiture est de couleur verte
    avec cette simple liste de thèmes (=listetest.txt) :

    voiture
    couleur
    verte
    Et en sortie, je me retrouve avec :

    la voiture est de couleur verte.la voiture est de couleur verte.la voiture est de couleur verte.
    Comprenez-vous pourquoi ?

    Merci d'avance.

  17. #17
    Membre régulier
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Décembre 2012
    Messages : 43
    Points : 91
    Points
    91
    Par défaut
    tu as 3 thèmes, et ta phrase contient les 3 thèmes, donc étant donné que tu fait une recherche thème après thème sur la même phrase, chaque thème 'match' avec la phrase et donc tu affiche 3 fois la phrase.

    Pour corriger ce problème d'occurence de la recherche, il faut que tu mettes les résultats de la recherche dans un tableau puis que tu supprimes les doublons (ou triplon, même méthode) dans ce tableau, et finalement que tu affiches le tableau.
    Saaaaluuut Nounou!!

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Points : 25
    Points
    25
    Par défaut
    Oui mais il ne fait toujours pas ce que je souhaitais à la base, à savoir : retrouver les mots de la listetest.txt dans le corpustest mais entre les balises <theme>motdelalistetest.txt</theme>

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Points : 25
    Points
    25
    Par défaut
    J'ai trouvé une solution à une partie de mon bug, le fichier listetest.txt que j'ai fait manuellement avait des caractères cachés de fin de ligne. J'ai vu que notepad++ affiché CRLF à la fin de chaque ligne (version windows) quand je suis passée en mode unix. Le programme ne fait plus la répétition par contre il ne met toujours pas les balises entre les thèmes

  20. #20
    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
    Tout d'abord, dans cette boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	foreach my $theme (values %theme){
    tu choisis de parcourir les valeurs du hash %theme, alors que ce sont les clés qui contiennent les thèmes du fichier listetext.txt.

    Il faut donc écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	foreach my $theme (keys %theme){
    Ensuite, lors de la lecture de ces thèmes, il faut s'assurer qu'aucune ligne "vide" n'introduise de thème "fantôme" qui serait vide, et qui pour le coup, donnerait en temps qu'expression régulière des matches à tous les caractères.
    Par ailleurs, si les thèmes venaient à contenir des caractères spéciaux de regexp, ils pourraient être interprétés, ce qui ne serait pas bon.
    A la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my %theme = map { chomp; $_ => 1 } <$theme>;
    il faudrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my %theme = map { quotemeta $_ => 1 } grep $_, map { chomp ; $_ } <$theme>;
    D'abord, on chomp avec map { chomp; $_ }
    Ensuite on filtre les themes vide avec grep $_
    Et pour finir on construit un élément de hash avec map { quotemeta $_ => 1 }
    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

Discussions similaires

  1. [SimpleXML] Gestion d'une liste avec xml
    Par juninho269 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 29/05/2008, 17h06
  2. Combobox, list et XML
    Par faithinlove dans le forum Flash
    Réponses: 1
    Dernier message: 26/03/2008, 10h04
  3. [Package listings] Commentaires XML et quote
    Par arnobidul dans le forum Mise en forme
    Réponses: 0
    Dernier message: 27/07/2007, 11h54
  4. [JDOM] Probleme liste et XML
    Par xavier1936 dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 16/04/2007, 17h59
  5. [XML]Liste élément XML
    Par SteelBox dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 15/06/2006, 00h11

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