Problème éxécution condition dans une expression régulière.
Bonjour à tous,
je débute en Perl et je suis confonté à un pb que je ne connais pas ? en faite voici mon code :
Code:
1 2 3 4 5 6 7 8
| foreach (@LINES) {
if ($_= /<A target=\"_top\" HREF=\"(.*)\"><nobr>(.*)<\/A><\/TD>/ ) {
...
}
elsif ($_= /<A target=\"_top\" HREF=\"(.*)\"><nobr>(.*) </A><\/TD>/g) {
...
}
} |
Mon elsif ne semble pas être vérifié dans la condition ? peux t'on utiliser 2 fois dans une boucle la variable $_ ? L'expression vérifiée dans le elsif n' est t'elle vérifiée que si la condition If est positive ?
Merci d'avance,
Yann
Edité par GLDavid, merci de penser aux balises code :tagcode:
Re: Problème éxécution condition dans une expression réguliè
Citation:
Envoyé par panaone
Mon elsif ne semble pas être vérifié dans la condition ? peux t'on utiliser 2 fois dans une boucle la variable $_ ?
Il est tout à fait possible d'utiliser la variable $_ autant de fois que l'on veut, à l'intérieur d'une boucle.
Comme cette variable est aussi la variable contextuelle, sur laquelle les traitements portent par défaut, il est possible de simplifier la syntaxe de correspondance d'expression rationnelle, ainsi :
Code:
1 2 3 4 5
| foreach (@ensemble) {
if ( /motif/ ) {
...
}
} |
Ainsi, on ne précise pas que la correspondance est faite sur $_, ce qui est le cas par défaut, et cela évite l'erreur que tu as commise :
l'opérateur de mise en correspondance d'expression rationnelle est =~, pas =.
Tu aurais donc dû écrire, à défaut de la forme abrégée ci-dessus :
Code:
1 2 3
| if ( $_ =~ m/motif/ ) {
...
} |
En outre, en fonction de ce que tu fais, dans tes conditions, il peut être avantageux de nommer la variable de parcours de la boucle ... dans ce genre :
Code:
1 2 3 4 5
| foreach my $element (@ensemble) {
if ( $element =~ m/motif/ ) {
...
}
} |
Citation:
Envoyé par panaone
L'expression vérifiée dans le elsif n' est t'elle vérifiée que si la condition If est positive ?
Le elsif, comme son nom l'indique, est une condition testée si la condition principale n'est pas vérifiée (c'est à dire si elle est fausse).
Tu pourras trouver de l'information à ces différents sujets dans notre FAQ Perl, notamment à la rubrique sur les alternatives (les ifs), les boucles énumérées et les expressions rationnelles
Bonne continuation.
Explications pour un débutant
Merci tout matche comme il faut mais peux tu m'expliquer pourquoi ?
Tu me dis que l'opérateur de mise en correspondance d'expression rationnelle est =~, et pas =.
>> Je croyais que lorsque que l'on utilise la variable $_ on peut omettre le =~ ??
A quoi correspond le m dans m/motif/ ??? Quel est son rôle.
Merci,
Yann
Re: Explications pour un débutant
Citation:
Envoyé par panaone
Merci tout matche comme il faut mais peux tu m'expliquer pourquoi ?
Tu me dis que l'opérateur de mise en correspondance d'expression rationnelle est =~, et pas =.
>> Je croyais que lorsque que l'on utilise la variable $_ on peut omettre le =~ ??
A quoi correspond le
m dans m/motif/ ??? Quel est son rôle.
Merci,
Yann
Tu peux ne pas utiliser le "=~" dans le cas où tu utilises la variable "$_" implicitement soit :
Il faut par contre utiliser le "=~" dans le cas où tu utilises une variable explicitement (que ce soit "$_" ou n'importe quelle autre) :
Code:
if ($_ =~ /motif/) {...}
ou
Code:
if ($toto =~ /motif/ {...}
L'opérateur "=" n'étant utilisé en Perl que pour des affectations.
Re: Explications pour un débutant
Citation:
Envoyé par panaone
Merci tout matche comme il faut mais peux tu m'expliquer pourquoi ?
Tu me dis que l'opérateur de mise en correspondance d'expression rationnelle est =~, et pas =.
>> Je croyais que lorsque que l'on utilise la variable $_ on peut omettre le =~ ??
Relis mon post, ainsi que l'explication de Jeh, ainsi, aussi que la FAQ Perl ... L'opérateur = est celui d'affectation, l'opérateur =~est celui de matching (mise en correspondance). Ce sont donc deux opérateurs distincts au fonctionnement différent.
Lorsque l'on opère sur la variable $_, on est effectivement dispensé d'utiliser cet opérateur =~. On est d'ailleurs aussi dispensé de préciser qu'on travaille sur $_. C'est IMPLICITE !
Ton problème, c'est qu'une expression de mise en relation (le =~) fait le match, mais retourne aussi un résultat (la liste des matches en contexte de liste, où leur nombre en contexte scalaire).
Donc, lorsque tu écris :
Code:
if ( $_ = /motif/ )
Tu fais un enchainement d'opérations :
1- Tu fais la mise en correspondance (implicite) de $_ avec motif.
2- Ensuite, tu affectes le résultat de cette mise en correspondance au scalaire $_. Tu écrases donc $_ avec 0 (pas de correspondance) ou n (nombre de correspondances du motif)
3- Tu testes sur la valeur (nouvelle) de $_.
C'est comme si tu avais écrit :
Code:
1 2 3
| if ($_ = ( $_ =~ m/motif/ )) {
...
} |
Ton $_ est donc cramé pour la suite :(
L'explication te convient elle ?
Citation:
Envoyé par panaone
A quoi correspond le m dans m/motif/ ??? Quel est son rôle.
Le m est superflu, car c'est la fonction d'expression rationnelle par défaut, mais j'aime bien le préciser pour que les choses soient claires. C'est la fonction de recherche de motif (m comme match). Les autres possibilités sont s pour faire une substitution, ou tr pour une "traduction" (translittération, en fait).
Bonne continuation.