Je suis en train de r=E9aliser un petit script qui me permet de
remplacer les acronymes par la balise <acronym> et le mot complet.
J'ai un fichier texte qui contient l'acronyme et le code html, que je
splite pour remplir deux tableaux, et ensuite je parcours mon fichier
texte a la recherche d'occurences des acronymes.
@mot contient les acronymes, et @remplacement contient le code html
J'utilise le code suivant, pour chaque ligne du fichier (*.txt de
petite taille)
sub parse_ligne
{
my $ligne =3D $_;
for ( my $i =3D 0 ; $i < $dictionnaire_taille-1 ; $i++ )
{
if ($ligne =3D~ m/$mot[$i]/gi)
{
$ligne =3D~ s/$mot[$i]/$remplacement[$i]/gi;
}
}
//print $ligne;
print `echo $ligne >> $path_sortie`;
}
Mon probleme, c'est que
- les accronymes ne sont pas remplac=E9s
- seule la derni=E8re ligne du fichier de d=E9part est dans le fichier de
sortie
Est-ce que quelqu'un peut me donner un petit indice ?
Les bugs sont biens là... Je corrige les principaux au fur et à mesure mais il y aurait beaucoup à redire.
À (at) 6 Jun 2006 04:53:09 -0700, "Timothée POISOT" écrivait (wrote):
#!C:perlbienperl.exe -w use strict; use Warnings;
use warnings; # pas de majuscule !
my @dictionnaire; my $dictionnaire_taille; my (@mot, @remplacement); my @fichier_entree; my @fichier_sortie; my $path_entree; my $path_sortie;
# déclarer les variables là où elles sont nécessaires...
&head;
head(); # la notation &head n'a pas le sens que vous croyez...
Des éclaircissements sur le sens ???
# Il vaut mieux appeler une fonction par son nom et une liste de # paramètres (éventuellement vide) et sans & devant !
$dictionnaire_taille = @dictionnaire;
$dictionnaire_taille = @mot; # @dictionnaire ne devrait exister que dans 'head'
sub head { print "Lecture du dictionnairen"; open (DIC, "+<dictionnaire.txt") or die "nLe fichier dictionnaire.txt doit etre present ($!) !";
open (DIC, "<", "dictionnaire.txt") or die "Le fichier 'dictionnaire.txt' doit etre present : $!";
# le mode "+<" ne vous sert strictement à rien ici
my @dictionnaire = <DIC>; close (DIC); foreach ( @dictionnaire ) { my ($mot, $remplacement); ($mot, $remplacement) = split(/¤/, $_); unshift(@mot, $mot); unshift(@remplacement, $remplacement); print "$mottt$remplacementnn"; } }
&entree_fichier;
sub entree_fichier { print "nEntrez le nom du fichier a convertir:n"; print "t>>"; $path_entree = <STDIN>; chomp($path_entree); $path_sortie = $path_entree.'.LOMoutput'; open (ENTR, "+<".$path_entree); my @fichier_entree = <ENTR>; close (ENTR); foreach (@fichier_entree) { &parse_ligne($_); } }
sub parse_ligne { my $ligne = $_[0]; chomp($ligne); for ( my $i = 1 ; $i < $dictionnaire_taille ; $i++ )
for ( my $i = 0 ; $i < $dictionnaire_taille ; $i++ )
# les indices commencent à zéro
{ if ($ligne =~ m|@mot[$i]|gi)
if ($ligne =~ m|$mot[$i]|gi)
# $mot[$i] n'a pas le même sens que @mot[$i]
Une autre explication sur le sens ???
# Il est inutile de préfixer les crochets puisque l'interpolation des # variables a lieu avant l'interprétation de la regexp par le moteur # de rexgexp.
print "$lignen"; # ne passe pas par un appel à un shell externe
# pour pouvoir écrire dans un fichier, il faudrait l'ouvrir en # écriture au préalable.
Les lignes sont bien présentes dans le fichier, mais il n'y a pas de remplacement
}
Personne n'a la solution a un probleme en apparence aussi simple ?
Paul Gaborit wrote:
Les bugs sont biens là... Je corrige les principaux au fur et à mesure
mais il y aurait beaucoup à redire.
À (at) 6 Jun 2006 04:53:09 -0700,
"Timothée POISOT" <t.poisot@gmail.com> écrivait (wrote):
#!C:perlbienperl.exe -w
use strict;
use Warnings;
use warnings; # pas de majuscule !
my @dictionnaire;
my $dictionnaire_taille;
my (@mot, @remplacement);
my @fichier_entree;
my @fichier_sortie;
my $path_entree;
my $path_sortie;
# déclarer les variables là où elles sont nécessaires...
&head;
head();
# la notation &head n'a pas le sens que vous croyez...
Des éclaircissements sur le sens ???
# Il vaut mieux appeler une fonction par son nom et une liste de
# paramètres (éventuellement vide) et sans & devant !
$dictionnaire_taille = @dictionnaire;
$dictionnaire_taille = @mot;
# @dictionnaire ne devrait exister que dans 'head'
sub head
{
print "Lecture du dictionnairen";
open (DIC, "+<dictionnaire.txt") or die "nLe fichier dictionnaire.txt
doit etre present ($!) !";
open (DIC, "<", "dictionnaire.txt")
or die "Le fichier 'dictionnaire.txt' doit etre present : $!";
# le mode "+<" ne vous sert strictement à rien ici
my @dictionnaire = <DIC>;
close (DIC);
foreach ( @dictionnaire )
{
my ($mot, $remplacement);
($mot, $remplacement) = split(/¤/, $_);
unshift(@mot, $mot);
unshift(@remplacement, $remplacement);
print "$mottt$remplacementnn";
}
}
&entree_fichier;
sub entree_fichier
{
print "nEntrez le nom du fichier a convertir:n";
print "t>>";
$path_entree = <STDIN>;
chomp($path_entree);
$path_sortie = $path_entree.'.LOMoutput';
open (ENTR, "+<".$path_entree);
my @fichier_entree = <ENTR>;
close (ENTR);
foreach (@fichier_entree)
{
&parse_ligne($_);
}
}
sub parse_ligne
{
my $ligne = $_[0];
chomp($ligne);
for ( my $i = 1 ; $i < $dictionnaire_taille ; $i++ )
for ( my $i = 0 ; $i < $dictionnaire_taille ; $i++ )
# les indices commencent à zéro
{
if ($ligne =~ m|@mot[$i]|gi)
if ($ligne =~ m|$mot[$i]|gi)
# $mot[$i] n'a pas le même sens que @mot[$i]
Une autre explication sur le sens ???
# Il est inutile de préfixer les crochets puisque l'interpolation des
# variables a lieu avant l'interprétation de la regexp par le moteur
# de rexgexp.
Les bugs sont biens là... Je corrige les principaux au fur et à mesure mais il y aurait beaucoup à redire.
À (at) 6 Jun 2006 04:53:09 -0700, "Timothée POISOT" écrivait (wrote):
#!C:perlbienperl.exe -w use strict; use Warnings;
use warnings; # pas de majuscule !
my @dictionnaire; my $dictionnaire_taille; my (@mot, @remplacement); my @fichier_entree; my @fichier_sortie; my $path_entree; my $path_sortie;
# déclarer les variables là où elles sont nécessaires...
&head;
head(); # la notation &head n'a pas le sens que vous croyez...
Des éclaircissements sur le sens ???
# Il vaut mieux appeler une fonction par son nom et une liste de # paramètres (éventuellement vide) et sans & devant !
$dictionnaire_taille = @dictionnaire;
$dictionnaire_taille = @mot; # @dictionnaire ne devrait exister que dans 'head'
sub head { print "Lecture du dictionnairen"; open (DIC, "+<dictionnaire.txt") or die "nLe fichier dictionnaire.txt doit etre present ($!) !";
open (DIC, "<", "dictionnaire.txt") or die "Le fichier 'dictionnaire.txt' doit etre present : $!";
# le mode "+<" ne vous sert strictement à rien ici
my @dictionnaire = <DIC>; close (DIC); foreach ( @dictionnaire ) { my ($mot, $remplacement); ($mot, $remplacement) = split(/¤/, $_); unshift(@mot, $mot); unshift(@remplacement, $remplacement); print "$mottt$remplacementnn"; } }
&entree_fichier;
sub entree_fichier { print "nEntrez le nom du fichier a convertir:n"; print "t>>"; $path_entree = <STDIN>; chomp($path_entree); $path_sortie = $path_entree.'.LOMoutput'; open (ENTR, "+<".$path_entree); my @fichier_entree = <ENTR>; close (ENTR); foreach (@fichier_entree) { &parse_ligne($_); } }
sub parse_ligne { my $ligne = $_[0]; chomp($ligne); for ( my $i = 1 ; $i < $dictionnaire_taille ; $i++ )
for ( my $i = 0 ; $i < $dictionnaire_taille ; $i++ )
# les indices commencent à zéro
{ if ($ligne =~ m|@mot[$i]|gi)
if ($ligne =~ m|$mot[$i]|gi)
# $mot[$i] n'a pas le même sens que @mot[$i]
Une autre explication sur le sens ???
# Il est inutile de préfixer les crochets puisque l'interpolation des # variables a lieu avant l'interprétation de la regexp par le moteur # de rexgexp.
print "$lignen"; # ne passe pas par un appel à un shell externe
# pour pouvoir écrire dans un fichier, il faudrait l'ouvrir en # écriture au préalable.
Les lignes sont bien présentes dans le fichier, mais il n'y a pas de remplacement
}
Personne n'a la solution a un probleme en apparence aussi simple ?
Paul Gaborit
À (at) 6 Jun 2006 06:18:11 -0700, "Timothée POISOT" écrivait (wrote): [...]
# la notation &head n'a pas le sens que vous croyez...
Des éclaircissements sur le sens ???
Si vous écrivez '&head;', la fonction 'head' reçoit @_ comme paramètres. Alors que si vous écrivez 'head();', la fonction 'head' reçoit une liste de paramètres vide. Petit extrait de 'perlsub' :
To call subroutines:
NAME(LIST); # & is optional with parentheses. NAME LIST; # Parentheses optional if predeclared/imported. &NAME(LIST); # Circumvent prototypes. &NAME; # Makes current @_ visible to called subroutine.
[...]
# $mot[$i] n'a pas le même sens que @mot[$i]
Une autre explication sur le sens ???
@mot[$i] est une liste (on dit une tranche) des valeurs extraite de @mot. En l'occurrence cette liste ne contient qu'une valeur ($mot[$i]). $mots[$i] n'est qu'un scalaire (une seule valeur). On peut écrire @mot[0..2] pour récupérer la liste des trois premières valeurs du tableau @mot. Pour en savoir plus lire 'perldata'.
[...]
Les lignes sont bien présentes dans le fichier, mais il n'y a pas de remplacement
Si vous faites *toutes* les corrections que je vous ai proposées, ça marche (testé ici sur l'exemple fourni) !
Personne n'a la solution a un probleme en apparence aussi simple ?
Si : vous ! *Lisez* et essayez de *comprendre* toutes les réponses qui vous ont été faites. Même sans ma réponse et sans votre script complet tous les éléments de debogage étaient déjà dans les réponses précedentes !
-- Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> Perl en français - <http://perl.enstimac.fr/>
À (at) 6 Jun 2006 06:18:11 -0700,
"Timothée POISOT" <t.poisot@gmail.com> écrivait (wrote):
[...]
# la notation &head n'a pas le sens que vous croyez...
Des éclaircissements sur le sens ???
Si vous écrivez '&head;', la fonction 'head' reçoit @_ comme
paramètres. Alors que si vous écrivez 'head();', la fonction 'head'
reçoit une liste de paramètres vide. Petit extrait de 'perlsub' :
To call subroutines:
NAME(LIST); # & is optional with parentheses.
NAME LIST; # Parentheses optional if predeclared/imported.
&NAME(LIST); # Circumvent prototypes.
&NAME; # Makes current @_ visible to called subroutine.
[...]
# $mot[$i] n'a pas le même sens que @mot[$i]
Une autre explication sur le sens ???
@mot[$i] est une liste (on dit une tranche) des valeurs extraite de
@mot. En l'occurrence cette liste ne contient qu'une valeur
($mot[$i]). $mots[$i] n'est qu'un scalaire (une seule valeur). On
peut écrire @mot[0..2] pour récupérer la liste des trois premières
valeurs du tableau @mot. Pour en savoir plus lire 'perldata'.
[...]
Les lignes sont bien présentes dans le fichier, mais il n'y a pas de
remplacement
Si vous faites *toutes* les corrections que je vous ai proposées, ça
marche (testé ici sur l'exemple fourni) !
Personne n'a la solution a un probleme en apparence aussi simple ?
Si : vous ! *Lisez* et essayez de *comprendre* toutes les réponses qui
vous ont été faites. Même sans ma réponse et sans votre script complet
tous les éléments de debogage étaient déjà dans les réponses
précedentes !
--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>
À (at) 6 Jun 2006 06:18:11 -0700, "Timothée POISOT" écrivait (wrote): [...]
# la notation &head n'a pas le sens que vous croyez...
Des éclaircissements sur le sens ???
Si vous écrivez '&head;', la fonction 'head' reçoit @_ comme paramètres. Alors que si vous écrivez 'head();', la fonction 'head' reçoit une liste de paramètres vide. Petit extrait de 'perlsub' :
To call subroutines:
NAME(LIST); # & is optional with parentheses. NAME LIST; # Parentheses optional if predeclared/imported. &NAME(LIST); # Circumvent prototypes. &NAME; # Makes current @_ visible to called subroutine.
[...]
# $mot[$i] n'a pas le même sens que @mot[$i]
Une autre explication sur le sens ???
@mot[$i] est une liste (on dit une tranche) des valeurs extraite de @mot. En l'occurrence cette liste ne contient qu'une valeur ($mot[$i]). $mots[$i] n'est qu'un scalaire (une seule valeur). On peut écrire @mot[0..2] pour récupérer la liste des trois premières valeurs du tableau @mot. Pour en savoir plus lire 'perldata'.
[...]
Les lignes sont bien présentes dans le fichier, mais il n'y a pas de remplacement
Si vous faites *toutes* les corrections que je vous ai proposées, ça marche (testé ici sur l'exemple fourni) !
Personne n'a la solution a un probleme en apparence aussi simple ?
Si : vous ! *Lisez* et essayez de *comprendre* toutes les réponses qui vous ont été faites. Même sans ma réponse et sans votre script complet tous les éléments de debogage étaient déjà dans les réponses précedentes !
-- Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> Perl en français - <http://perl.enstimac.fr/>