Pb perl
Résolu
Pouppina
Messages postés
5
Date d'inscription
Statut
Membre
Dernière intervention
-
Spylk Messages postés 1809 Date d'inscription Statut Membre Dernière intervention -
Spylk Messages postés 1809 Date d'inscription Statut Membre Dernière intervention -
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;
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:
- Pb perl
- Denon perl pro test - Accueil - Audio
- Active perl - Télécharger - Édition & Programmation
- DzSoft Perl Editor - Télécharger - Édition & Programmation
- Comment lire un fichier .pl perl ? - Forum Windows
- Perl: transformer un fichier en package ✓ - Forum Perl
4 réponses
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 ...
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 ...
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 !
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 !
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 ...