Pb perl

Résolu/Fermé
Pouppina Messages postés 5 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 20 mars 2008 - 22 févr. 2008 à 10:12
Spylk Messages postés 1809 Date d'inscription vendredi 8 février 2008 Statut Membre Dernière intervention 23 mars 2011 - 22 févr. 2008 à 15:10
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;
A voir également:

4 réponses

Spylk Messages postés 1809 Date d'inscription vendredi 8 février 2008 Statut Membre Dernière intervention 23 mars 2011 383
22 févr. 2008 à 10:29
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 ...
0
Pouppina Messages postés 5 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 20 mars 2008
22 févr. 2008 à 10:43
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 ;-)
0
Spylk Messages postés 1809 Date d'inscription vendredi 8 février 2008 Statut Membre Dernière intervention 23 mars 2011 383 > Pouppina Messages postés 5 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 20 mars 2008
22 févr. 2008 à 11:05
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 ...
0
Pouppina Messages postés 5 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 20 mars 2008 > Spylk Messages postés 1809 Date d'inscription vendredi 8 février 2008 Statut Membre Dernière intervention 23 mars 2011
22 févr. 2008 à 11:11
ouiiiiiiiiiiiiiiiiii, c'est bien ça, merci beaucoup. ;-)
0
Spylk Messages postés 1809 Date d'inscription vendredi 8 février 2008 Statut Membre Dernière intervention 23 mars 2011 383
22 févr. 2008 à 11:11
désolé, il faut que je lève le camps pour le moment je reviens dans l'aprés-midi ....
0
Spylk Messages postés 1809 Date d'inscription vendredi 8 février 2008 Statut Membre Dernière intervention 23 mars 2011 383
22 févr. 2008 à 14:42
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 !
0
Pouppina Messages postés 5 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 20 mars 2008
22 févr. 2008 à 15:09
merci beaucoup pour ces lien :-)
0
Spylk Messages postés 1809 Date d'inscription vendredi 8 février 2008 Statut Membre Dernière intervention 23 mars 2011 383
22 févr. 2008 à 15:10
pas de pb .. n'hésite pas si je suis en ligne ...
0