On May 12, 12:59 pm, Vincent Lefevre <vincent+ wrote:
Dans l'article , kurtz le pirate écrit:
for (@file) { print "1>$_n"; #s/(<.*>)/$points{$1}/g; s/(<.+>)/XXX/g; print "2>$_nn"; } la substitution ne se fait que pour la première occurence et pas pour les autres. ce script retourne par exemple : 1>cylinder{<0, 0, 1.0705>,<0.71364, 0, 0.79788> R2} 2>cylinder{XXX R2}
<.*> matche <0, 0, 1.0705>,<0.71364, 0, 0.79788>
pourtant il y a bien de 'g' :(( j'ai raté quoi ?
Peut-être la différence entre greedy et non-greedy. Essaie (<.*?>)
Tout à fait.
Pour des explications sur les quantificateurs "gourmands" ("greedy" en Anglais), comme par ex. /.*/, contre les quantificateurs "minimaux" ou "sobres" ("non-greedy" en Anglais), comme, par ex. /.*?/, voir http://perl.enstimac.fr/DocFr/perlretut.html paragraphe "Reconnaissances répétées".
ou bien (<[^>]*>).
Egalement correct. TIMTOWDI oblige.
Pour des explications sur cette technique, voir le livre "Perl best practices" de Damian Conway, chapitre 12 "Regular Expressions", paragraphe "Unconstrained Repetitions".
-- Klaus
On May 12, 12:59 pm, Vincent Lefevre <vincent+n...@vinc17.org> wrote:
Dans l'article <kurtzlepirate-07F7A9.12483612052...@news-1.proxad.net>,
kurtz le pirate <kurtzlepir...@yahoo.fr> écrit:
for (@file) {
print "1>$_n";
#s/(<.*>)/$points{$1}/g;
s/(<.+>)/XXX/g;
print "2>$_nn";
}
la substitution ne se fait que pour la première occurence et pas pour
les autres. ce script retourne par exemple :
1>cylinder{<0, 0, 1.0705>,<0.71364, 0, 0.79788> R2}
2>cylinder{XXX R2}
<.*> matche <0, 0, 1.0705>,<0.71364, 0, 0.79788>
pourtant il y a bien de 'g' :(( j'ai raté quoi ?
Peut-être la différence entre greedy et non-greedy. Essaie (<.*?>)
Tout à fait.
Pour des explications sur les quantificateurs "gourmands" ("greedy" en
Anglais), comme par ex. /.*/, contre les quantificateurs "minimaux" ou
"sobres" ("non-greedy" en Anglais), comme, par ex. /.*?/, voir
http://perl.enstimac.fr/DocFr/perlretut.html paragraphe
"Reconnaissances répétées".
ou bien (<[^>]*>).
Egalement correct. TIMTOWDI oblige.
Pour des explications sur cette technique, voir le livre "Perl best
practices" de Damian Conway, chapitre 12 "Regular Expressions",
paragraphe "Unconstrained Repetitions".
On May 12, 12:59 pm, Vincent Lefevre <vincent+ wrote:
Dans l'article , kurtz le pirate écrit:
for (@file) { print "1>$_n"; #s/(<.*>)/$points{$1}/g; s/(<.+>)/XXX/g; print "2>$_nn"; } la substitution ne se fait que pour la première occurence et pas pour les autres. ce script retourne par exemple : 1>cylinder{<0, 0, 1.0705>,<0.71364, 0, 0.79788> R2} 2>cylinder{XXX R2}
<.*> matche <0, 0, 1.0705>,<0.71364, 0, 0.79788>
pourtant il y a bien de 'g' :(( j'ai raté quoi ?
Peut-être la différence entre greedy et non-greedy. Essaie (<.*?>)
Tout à fait.
Pour des explications sur les quantificateurs "gourmands" ("greedy" en Anglais), comme par ex. /.*/, contre les quantificateurs "minimaux" ou "sobres" ("non-greedy" en Anglais), comme, par ex. /.*?/, voir http://perl.enstimac.fr/DocFr/perlretut.html paragraphe "Reconnaissances répétées".
ou bien (<[^>]*>).
Egalement correct. TIMTOWDI oblige.
Pour des explications sur cette technique, voir le livre "Perl best practices" de Damian Conway, chapitre 12 "Regular Expressions", paragraphe "Unconstrained Repetitions".
-- Klaus
kurtz le pirate
In article , kurtz le pirate wrote:
bonjour,
je ne dois pas être bien réveillé ce matin :((
for (@file) { print "1>$_n"; #s/(<.*>)/$points{$1}/g; s/(<.+>)/XXX/g; print "2>$_nn"; }
mais oui bien sûr, les regex sont gourmandes. merci bien à tout les deux. j'avais aussi, entre temps, trouvé.
mais j'ai toujours le même type de problème dans une autre boucle. celle ou j'essaye justement d'isoler les <.$?> :
$indice=0; for (@file) { chomp; if (/(<.*?>)/) { if (!exists($points{$1})) { $points{$1}= "points[$indice]"; $indice++; } } }
ne détecte pas le troisième <..> dans une ligne comme ça :
@file contient chaque ligne du fichier? Si c'est le cas, c'est normal qu'il ne trouve pas le <...> coupé en deux. Il faut mettre tout le contenu du fichier dans une seule variable avec un truc du style
$file = do { local $/; <FILE> };
et utiliser les modifieurs s (pour que . matche le n) et g (recherche globale, voir les pages man pour ses diverses utilisations possibles).
@file contient chaque ligne du fichier? Si c'est le cas, c'est normal
qu'il ne trouve pas le <...> coupé en deux. Il faut mettre tout le
contenu du fichier dans une seule variable avec un truc du style
$file = do { local $/; <FILE> };
et utiliser les modifieurs s (pour que . matche le n) et g (recherche
globale, voir les pages man pour ses diverses utilisations possibles).
@file contient chaque ligne du fichier? Si c'est le cas, c'est normal qu'il ne trouve pas le <...> coupé en deux. Il faut mettre tout le contenu du fichier dans une seule variable avec un truc du style
$file = do { local $/; <FILE> };
et utiliser les modifieurs s (pour que . matche le n) et g (recherche globale, voir les pages man pour ses diverses utilisations possibles).