Bonjour à tous,
Je ne sais pas comment intituler le sujet, puisque je ne sais pas vraiment pourquoi j'ai le comportement que je vais décrire...
Voilà le bout de code qui me pose problème:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 use strict; do_it("263;160;507;410"); do_it("263;160;507;410"); sub do_it { my ($p)=@_; print "Entering do_it : \"$p\"\n"; my ($x1, $x2, $y1, $y2); $p=~/^([^;]*)(?{ $x1 = $^N});([^;]*)(?{ $y1 = $^N});([^;]*)(?{ $x2 = $^N});(.*)(?{ $y2 = $^N})$/; print "x1=$x1, y1=$y1, x2=$x2, y2=$y2\n"; print "Leaving do_it\n"; } __END__
L'objectif de cette fonction est d'extraire d'une chaine de caractères les coordonnées de 2 points, P1(x1,y1) et P2(x2,y2). La chaine de caractère se présente sous cette forme : "x1;y1;x2;y2"
J'ai écrit ce script pour le faire tourner sous HP-UX, perl -v = 5.8.2
Le problème que je rencontre, c'est que la première fois que j'appel cette fonction, l'extraction se passe bien, et la fois suivante, rien n'est extrait... Et pourtant si la chaine match une première fois, elle n'a aucune raison de ne pas matcher une autre fois...
Le problème, est, je pense sur la ligne :
et je pense que ca concerne la portée des variables, parceque si je déplace la ligne my ($x1, $x2, $y1, $y2); juste en dessous du use strict; (donc en dehors de la fonction), alors ca fonctionne parfaitement ... mais ce n'est pas propre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part $p=~/^([^;]*)(?{ $x1 = $^N});([^;]*)(?{ $y1 = $^N});([^;]*)(?{ $x2 = $^N});(.*)(?{ $y2 = $^N})$/;
Je peux aussi ré-écrire l'expression sous une autre forme (par exemple):
Et c'est une bonne solution puisque ca résoud mon problème...
Code : Sélectionner tout - Visualiser dans une fenêtre à part ($x1, $y1, $x2, $y2) = ($p=~/^([^;]*);([^;]*);([^;]*);(.*)$/);
Mais j'aimerais vraiment savoir pourquoi le première expression ne fonctionne pas ? Avez vous des idées ?
Merci pour vos réponses,
Lilian.
Partager