Pb perl

[Résolu/Fermé]
Signaler
Messages postés
5
Date d'inscription
jeudi 21 février 2008
Statut
Membre
Dernière intervention
20 mars 2008
-
Messages postés
1807
Date d'inscription
vendredi 8 février 2008
Statut
Membre
Dernière intervention
23 mars 2011
-
Bonjour,
je suis débutante en perl et j'ai un souci avec un programme que je suis en train de réaliser, peut-être que quelqu'un saura m'éclairer.

Voilà je veux faire des traitements très simples sur des fichiers xml situés dans un répertoire.
je veux créer des copies de ces fichiers mais si je rencontre (par exemple) les balises:

<item>route des bois<tag>route des bois</tag></item>

je veux bien entendu que cette ligne soit présente dans le fichier de sortie mais que j'ai en plus ces deux autres lignes:

<item>chemin<tag>route des bois</tag></item>
<item>passage<tag>route des bois</tag></item>

j'ai réussi à le faire pour la première substitution mais ça ne marche pas pour la seconde, quelqu'un saurait me dire pourquoi?

je préfère ne pas utiliser le module XML::Simple, car je ne suis pas encore à l'aise avec les module.

Voici mon programme:
#!/usr/bin/perl

my @tab;

my $ligne;
#lecture des entrees d'un repertoire
opendir REP, "Test" or die "impossible d'ouvrir le repertoire";
@fichiers = readdir REP;
closedir REP;
#chmod 0755, @fichiers;

#pour chaque fichier de mon répertoire
foreach $entree (@fichiers){
if ($entree=~/xml/){
#si le nom de mon fichier contient xml
print "$entree\n";
#j'ouvre le fichier en lecture
open (IN,"<Test/$entree")||die "erreur fichier ouverture $!";
#j'en ouvre un autre en écriture
open (OUT,">Test/test$entree")||die "erreur fichier ouverture $!";
while($ligne=<IN>){
chomp($ligne);
print OUT "$ligne\n";

if ($ligne =~/<item>.*(route).*<tag>.*/){
$ligne=~s/$1/chemin/;
print OUT "$ligne\n";
}
if ($ligne =~/<item>.*(route).*<tag>.*/){
$ligne=~s/$1/passage/;
print OUT "$ligne\n";

}
}

}

}

closedir REP;

4 réponses

Messages postés
1807
Date d'inscription
vendredi 8 février 2008
Statut
Membre
Dernière intervention
23 mars 2011
372
salut poupina , sans indentation et sans explication, j'avoue être perdu dans ton prog ....

tu veux rechercher des tag ok, avec une expression régulière ok ....
mais les champs que tu récupère sont à la suite des uns des autres ,est-ce dans un autre fichier ? créé à la volée ???

peux-tu mettre une pseudo ligne de log qui match en entier stp ...
Messages postés
5
Date d'inscription
jeudi 21 février 2008
Statut
Membre
Dernière intervention
20 mars 2008

désolée, 
heu je comprends pas vraiment la terminologie informatique mais je vais essayer de t'expliquer,
je te montre un fichier en entrée, un autre en sortie et j'ai rajouté des commentaires dans mon 
code.


voilà mon fichier d'entrée:


<?xml version="1.0" encoding="ISO-8859-1"?>
<grammar version="1.0" xml:lang="fr-fr" root="STREET"
	xmlns="http://www.w3.org/2001/06/grammar"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.w3.org/2001/06/grammar 
	http://www.w3.org/TR/speech-grammar/grammar.xsd">


<rule id="STREET">
		<one-of>
			<item>route de leudelange<tag>route de leudelange</tag></item>
			<item>rue du village<tag>rue du village</tag></item>
		</one-of>
	</rule>
</grammar>


voici ce que j'obtiens avec mon code:

<?xml version="1.0" encoding="ISO-8859-1"?>
<grammar version="1.0" xml:lang="fr-fr" root="STREET"
	xmlns="http://www.w3.org/2001/06/grammar"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.w3.org/2001/06/grammar 
	http://www.w3.org/TR/speech-grammar/grammar.xsd">


<rule id="STREET">
		<one-of>
			<item>route de leudelange<tag>route de leudelange</tag></item>
			<item>chemin de leudelange<tag>route de leudelange</tag></item>
			<item>rue du village<tag>rue du village</tag></item>
		</one-of>
	</rule>
</grammar>



Voici mon code
#!/usr/bin/perl

my @tab;

my $ligne;
#lecture des entrees d'un repertoire
opendir REP, "Test" or die "impossible d'ouvrir le repertoire";
@fichiers = readdir REP;
closedir REP;

#pour chaque fichier de mon répertoire
foreach $entree (@fichiers){
  if ($entree=~/xml/){
   #si le nom de mon fichier contient xml
    print "$entree\n";
    #j'ouvre le fichier en lecture
    open (IN,"<Test/$entree")||die "erreur fichier ouverture $!";
        #j'en ouvre un autre en écriture
    open (OUT,">Test/test$entree")||die "erreur fichier ouverture $!";
        while($ligne=<IN>){
        chomp($ligne);
        print OUT "$ligne\n";
        

#si dans mon fichier d'entrée entre le tag <item> et le tag <tag> je trouve la chaine 
#de caractère /route/
#je veux que dans mon fichier de sortie la chaine soit remplacée par /chemin/

           if ($ligne =~/<item>.*(route).*<tag>.*/){
               $ligne=~s/$1/chemin/;
             print OUT "$ligne\n";
             }

##jusque là ça marche

##c'est à partir de là que ça fonctionne pas, je veux dire que s'il trouve /route/ 
#il remplace aussi /route/ par /passage/ à cet endroit  entre ##<item> et le tag <tag>

            if ($ligne =~/<item>.*(route).*<tag>.*/){
             $ligne=~s/$1/passage/;
              print OUT "$ligne\n";

         ##ici ça n'a pas marché , en somme si dans mon fichier input, il trouve /route/ ,
# il recopie  la ligne mais il m'écrit deux autres avec les modifications voulues.
           
            }
     }

  }

}

closedir REP; 

j'espère que c'est plus explicite ;-)
Messages postés
1807
Date d'inscription
vendredi 8 février 2008
Statut
Membre
Dernière intervention
23 mars 2011
372 >
Messages postés
5
Date d'inscription
jeudi 21 février 2008
Statut
Membre
Dernière intervention
20 mars 2008

il ne peut pas le faire dans la deuxième boucle puisque route à été remplacé par chemin ... il ne le fera jamais !

enfin si j'ai bien pigé ...

if ($ligne =~/<item>.*(route).*<tag>.*/){
$ligne2=~s/$1/chemin/;
print OUT "$ligne2\n";
}

comme ça tu peux continuer à travailler sur ligne puisqu'elle est toujours la même ...
Messages postés
5
Date d'inscription
jeudi 21 février 2008
Statut
Membre
Dernière intervention
20 mars 2008
>
Messages postés
1807
Date d'inscription
vendredi 8 février 2008
Statut
Membre
Dernière intervention
23 mars 2011

ouiiiiiiiiiiiiiiiiii, c'est bien ça, merci beaucoup. ;-)
Messages postés
1807
Date d'inscription
vendredi 8 février 2008
Statut
Membre
Dernière intervention
23 mars 2011
372
désolé, il faut que je lève le camps pour le moment je reviens dans l'aprés-midi ....
Messages postés
1807
Date d'inscription
vendredi 8 février 2008
Statut
Membre
Dernière intervention
23 mars 2011
372
RE !

sinon, avec perl et sa puissance pour le traitements sur les écrits, je te conseille un peu de lecture pour te faciliter la vie


les EXPRESSIONS REGULIERES

http://www.journaldunet.com/developpeur/tutoriel/cgi/010315cgi_expreg.shtml

https://www.april.org/files/groupes/doc/perl/perl-6.html?q=groupes/doc/perl/perl-6.html

https://formation-perl.fr/guide-perl-08.html

ça parait pénible mais c'est ultra puissant une fois que tu as pigé les bases !
Messages postés
5
Date d'inscription
jeudi 21 février 2008
Statut
Membre
Dernière intervention
20 mars 2008

merci beaucoup pour ces lien :-)
Messages postés
1807
Date d'inscription
vendredi 8 février 2008
Statut
Membre
Dernière intervention
23 mars 2011
372
pas de pb .. n'hésite pas si je suis en ligne ...