Re: a propos des regexpr
  Home FAQ Contact Sign in
fr.comp.lang.perl only
 
Advanced search
POPULAR GROUPS

more...

 Up
Re: a propos des regexpr         

Group: fr.comp.lang.perl · Group Profile
Author: Klaus
Date: Jul 10, 2007 07:53

On Jul 9, 7:07 pm, kurtz le pirate wrote:
> In article <1183913607.955764.80...@w3g2000hsg.googlegroups.com>,
>
> Klaus gmail.com> wrote:
>> Tester "if ($1)" est dangereux et potentiellement faux.
>
>> Pour être correct il faut écrire:
>
>> if (/<(.*)>(.*)<\/\1>/) {
>> if ($1 eq "AppName") {

[ snip ]
> ce que je ne comprends pas c'est que mon script me donne bien le
> résultat attendu :((

Un test qui donne toujours le bon résultat est un signal pour tester
encore mieux :))

Par exemple, quand je veux tester la regexp /<(.*)>(.*)<\/\1>/ avec un
"if ($1) {..." derrière
(je sais, la partie "if ($1) {...." n'est pas propre , mais je veux la
tester)

...je peux, par exemple, écrire un programme ("test.pl") :

============================
use strict;
use warnings;

while () { chomp;
print "'$_' =~ /<(.*)>(.*)<\/\\1>/ ";
/<(.*)>(.*)<\/\1>/;
if ($1) {
print "trouve \$1 = '$1'\n";
}
else {
print "non trouve\n";
}
}
__DATA__
1
2
3
============================

Le résultat du programme "test.pl" est bon:
============================
'
1' =~ /<(.*)>(.*)/ non trouve
'2' =~ /<(.*)>(.*)/ trouve $1 = 'b'
'3' =~ /<(.*)>(.*)/ trouve $1 = 'c'
============================

On pourrait croire que le test est bon, mais si je renverse les lignes
...

============================
__DATA__
3
2
1
============================

...j'obtiens un mauvais résultat:
============================
'3' =~ /<(.*)>(.*)/ trouve $1 = 'c'
'2' =~ /<(.*)>(.*)/ trouve $1 = 'b'
'
1' =~ /<(.*)>(.*)/ trouve $1 = '/b'
============================
> je vais relire le perlfaq4 comme tu le suggère.

Dans Perlfaq4: "Comment repérer des éléments appariés ou imbriqués ?",
je pense la passage suivante correspond à ta question:
============================
[...]
++ situant entre deux caractères simples, un motif comme
++ /x([^x]*)x/ mettra les morceaux de l'intervalle dans $1.
++ Lorsque le séparateur est de plusieurs caractères, il
++ faudrait en utiliser un ressemblant plus à /alpha(.*?)omega/.
[...]
============================

On pourrait écrire également:

if (/<([^>]*?)>([^<]*?)<\/\1>/) {

--
Klaus
no comments
diggit! del.icio.us! reddit!

RELATED THREADS
SubjectArticles qty Group
Dépenses de consommation des m énages encturésalt.fr.tribunes.libres ·
[39-45] Avions de guerre - Bombardiers de l'Armée de l'Air française - Bréguet Br.690/695fr.soc.politique ·
P. Hopko: Samedi de Lazare et Dimanche des Rameaux (ou Palmes)fr.soc.religion ·