OVH Cloud OVH Cloud

[RegExp] motif avec variables ?

9 réponses
Avatar
Julien C.
Bonjour,

Je veux ans une boucle remplacer à la volé des motifs qui sont varible.
Pour l'instant j'ai pas d'erreur mais ca ne me remplace rien ? Qu'est ce
qui cloche ? je mi pomme un peu entre les variables interpolées ou pas
les \s, ...

#---------------------------------------------
my @findPat;
$findPat[0] = "(application|session)\\s?\\(\"STANDART_";
$findPat[1] = "<!--\\s#include\\svirtual=\"/standart/";

et dans une boucle suivant pour chaque $siteEnCours
my @replacePat;
$replacePat[0] = '$1("'.$syncSite{$siteEnCours}{"client"};
$replacePat[1] = '<!-- #include
virtual="'.$syncSite{$siteEnCours}{"include"};

et dans une autre boucle on remplace :
$buffer =~ s/$findPat[$i]/$replacePat[$i]/gi;
#---------------------------------------------

Merci d'avance Julien.

9 réponses

Avatar
Julien C.
En fait ca fonctionne, mis à part le remplacement par la mémoire $1 dans
$replacePat[0] qui devrai correspondre à application ou session. à
l'execution il ne me remplace pas $1 il me le met tel quel... si je
remplace ' par " il me remplace $1 par rien puisque la variable n'existe
pas encore.

$replacePat[0] = '$1("'.$syncSite{$siteEnCours}{"client"};

une solution ?
merci d'avance, julien.


Julien C. wrote:
Bonjour,

Je veux ans une boucle remplacer à la volé des motifs qui sont varible.
Pour l'instant j'ai pas d'erreur mais ca ne me remplace rien ? Qu'est ce
qui cloche ? je mi pomme un peu entre les variables interpolées ou pas
les s, ...

#---------------------------------------------
my @findPat;
$findPat[0] = "(application|session)s?("STANDART_";
$findPat[1] = "<!--s#includesvirtual="/standart/";

et dans une boucle suivant pour chaque $siteEnCours
my @replacePat;
$replacePat[0] = '$1("'.$syncSite{$siteEnCours}{"client"};
$replacePat[1] = '<!-- #include
virtual="'.$syncSite{$siteEnCours}{"include"};

et dans une autre boucle on remplace :
$buffer =~ s/$findPat[$i]/$replacePat[$i]/gi;
#---------------------------------------------

Merci d'avance Julien.


Avatar
Jérémy JUST
On Wed, 29 Sep 2004 14:19:46 +0200
"Julien C." wrote:

En fait ca fonctionne, mis à part le remplacement par la mémoire $1
dans $replacePat[0] qui devrai correspondre à application ou session.
à l'execution il ne me remplace pas $1 il me le met tel quel...


Normal, puisqu'il est entre guillemets simples. Je te propose
d'utiliser une syntaxe plus lisible:

$replacePat[0] = qq[$1("$syncSite{$siteEnCours}{"client"}] ;


si je remplace ' par " il me remplace $1 par rien puisque la variable
n'existe pas encore.


Euh... Tu préfèrerais que le compilateur invente une valeur?

Que veux-tu exactement?
Si tu veux te servir de la valeur de $1 venant d'une première regexp
pour construire une seconde regexp, tu as intérêt à recopier $1 dans une
variable intermédiaire. C'est plus simple, plus lisible, plus facile à
maintenir... en gros, il y a moins de risque d'erreurs.

Et tu si tu peux tout faire tenir dans une seule regexp, en utilisant
1 (ie ce qui a matché dans la première parenthèse; c'est l'équivalent
de $1, mais pendant que tu es encore dans la regexp), c'est encore
mieux.

--
Jérémy JUST

Avatar
Jack
Le 29/09/2004 14:19, :
En fait ca fonctionne, mis à part le remplacement par la mémoire $1 dans
$replacePat[0] qui devrai correspondre à application ou session. à
l'execution il ne me remplace pas $1 il me le met tel quel... si je
remplace ' par " il me remplace $1 par rien puisque la variable n'existe
pas encore.

$replacePat[0] = '$1("'.$syncSite{$siteEnCours}{"client"};

une solution ?


Avez vous regardé si les regex dynamiques étaient utilisables?

Avatar
Julien C.
Jack wrote:
Le 29/09/2004 14:19, :

En fait ca fonctionne, mis à part le remplacement par la mémoire $1
dans $replacePat[0] qui devrai correspondre à application ou session.
à l'execution il ne me remplace pas $1 il me le met tel quel... si je
remplace ' par " il me remplace $1 par rien puisque la variable
n'existe pas encore.

$replacePat[0] = '$1("'.$syncSite{$siteEnCours}{"client"};

une solution ?



Avez vous regardé si les regex dynamiques étaient utilisables?


non, j'ai rien trouvé dans la doc (j'ai lu rapidement ;-). mais a priori
ca devrait marcher. sinon ca limite son utilisation, non ? (je débute en
perl)

mon script se résume à ca :

#----------------------------------
my @findPat;
my @replacePat;
my $buffer;

$buffer = "If Application("XXX_Poipoi") <> "iopiop" Then n";
$buffer .= "If Session("XXX_Poipoi") <> "poipoi" Then ";

$findPat[0] = "(application|session)s?("XXX_";
$replacePat[0] = "1("YYY_";
^^^
$buffer =~ s/$findPat[0]/$replacePat[0]/gi;

print $buffer;
#----------------------------------

Resultat:

If 1("YYY_Poipoi") <> "iopiop" Then
If 1("YYY_Poipoi") <> "poipoi" Then


merci pour vos réponses, Julien C.


Avatar
Paul Gaborit
À (at) Thu, 30 Sep 2004 16:27:48 +0200,
"Julien C." écrivait (wrote):
$findPat[0] = "(application|session)s?("XXX_";
$replacePat[0] = "1("YYY_";

$buffer =~ s/$findPat[0]/$replacePat[0]/gi;


L'usage de 1, 2, etc. n'est autorisé que dans la regexp elle-même. Dans la
chaîne de remplacement, il faut utiliser $1, $2, etc. Pour l'instant, cette
erreur ne provoque qu'un warning mais un jour ce sera peut-être une erreur
fatale...

Une solution :

$findPat[0] = '(application|session)s?("XXX_';
$replacePat[0] = '"$1("YYY_"';

$buffer =~ s/$findPat[0]/$replacePat[0]/gie;

Une autre solution consiste à utiliser les sub anonymes :

$substituteSub[0] = sub {
my $buf = shift;
s{(application|session)s?("XXX_}{$1("YYY_}gi;
return $buf;
}


$buffer = $substituteSub[0]->($buffer);

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
Paul Gaborit
À (at) Thu, 30 Sep 2004 18:09:27 +0200,
Paul Gaborit écrivait (wrote):
$buffer =~ s/$findPat[0]/$replacePat[0]/gie;

Une autre solution consiste à utiliser les sub anonymes :

$substituteSub[0] = sub {
my $buf = shift;
s{(application|session)s?("XXX_}{$1("YYY_}gi;
return $buf;
}


$buffer = $substituteSub[0]->($buffer);


Heu... une petite erreur : la substitution doit s'appliquer à '$buf'...

$buf =~ s{(application|session)s?("XXX_}{$1("YYY_}gi;


--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
Julien C.
ok.
la 1er méthode ne fonctionne pas(il me remplace $1 par "$1" ... ) mais
la 2eme est ok.

Merci beaucoup. Julien C.
Avatar
Paul Gaborit
À (at) Fri, 01 Oct 2004 08:59:15 +0200,
"Julien C." écrivait (wrote):
la 1er méthode ne fonctionne pas(il me remplace $1 par "$1" ... )


Heu... Encore un oubli ! (Je devais être un peu fatigué hier...)

Pour que la première méthode fonctionne, il faut évaluer deux fois la chaîne
de remplacement.

Donc :

$buffer =~ s/$findPat[0]/$replacePat[0]/giee;
# ^^

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
Julien C.
merci je vais faire un test.