Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

ne pas recompiler une regex

4 réponses
Avatar
mpg
Bonjour,

grâce aux messages d'erreurs reçus en traitant un fichier mal formaté, je me
suis rendu compte que dans

grep (/$motif/, @liste);

la regexp semble être recompilée à pour chaque élément de la liste. Même si
pour ce script précis la performance n'est pas un problème, en général
j'imagine que c'est très mauvais.

Y a-t-il un moyen d'indiquer à Perl que $motif ne va pas changer au cours du
parcours de la liste (il changera plus tard, mais c'est un autre problème)
et que par conséquent il peut compiler une fois en début de liste et c'est
tout ?

Merci d'avance !

Manuel.

4 réponses

Avatar
espie
In article <g83u3h$1sp3$, mpg wrote:
Bonjour,

grâce aux messages d'erreurs reçus en traitant un fichier mal formaté, je me
suis rendu compte que dans

grep (/$motif/, @liste);

la regexp semble être recompilée à pour chaque élément de la liste. Même si
pour ce script précis la performance n'est pas un problème, en général
j'imagine que c'est très mauvais.

Y a-t-il un moyen d'indiquer à Perl que $motif ne va pas changer au cours du
parcours de la liste (il changera plus tard, mais c'est un autre problème)
et que par conséquent il peut compiler une fois en début de liste et c'est
tout ?



Oui, suffit de mettre /$motif/o

perlre renvoie a perlop
qui le documente... j'avoue que ca n'est pas immediat a trouver...
Avatar
mpg
Le (on) vendredi 15 août 2008 14:58, Marc Espie a écrit (wrote) :

Oui, suffit de mettre /$motif/o

perlre renvoie a perlop
qui le documente... j'avoue que ca n'est pas immediat a trouver...



Merci beaucoup. Par contre même après avoir lu la partie correspondante de
perlop, j'ai du mal à comprendre la « portée » du truc. En fait ma
situation est un peu comme ça :

for $motif (@listemotifs) {
&fairedestrucs() if (grep (/$motif/o, @autreliste));
}

Après essai, j'ai l'impression que ça ne marche plus si je rajoute le
remplace /$motif/ par /$motif/o (par contre ça va en effet plus vite).

Est-ce que ça veut dire que si je voulais optimiser le truc, je devrais
passer par des construction plus sophistiquées avec qr() ?

Merci,
Manuel.
Avatar
espie
In article <g840cj$25rn$, mpg wrote:
Le (on) vendredi 15 août 2008 14:58, Marc Espie a écrit (wrote) :

Oui, suffit de mettre /$motif/o

perlre renvoie a perlop
qui le documente... j'avoue que ca n'est pas immediat a trouver...



Merci beaucoup. Par contre même après avoir lu la partie correspondante de
perlop, j'ai du mal à comprendre la « portée » du truc. En fait ma
situation est un peu comme ça :

for $motif (@listemotifs) {
&fairedestrucs() if (grep (/$motif/o, @autreliste));
}

Après essai, j'ai l'impression que ça ne marche plus si je rajoute le
remplace /$motif/ par /$motif/o (par contre ça va en effet plus vite).


Oui, il compile une seule fois.


Est-ce que ça veut dire que si je voulais optimiser le truc, je devrais
passer par des construction plus sophistiquées avec qr() ?



Oui, c'est pas si complique que ca note.

Genre:
for my $motif (@listemotifs) {
my $re = qr/$motif/o;
fairedestrucs if grep $re, @autreliste;
}

et tu peux te passer du $re intermediaire avec un map:
for my $motif (map {qr/$_/o} @listemotifs) {
fairedestrucs if grep $motif, @autreliste;
}

ou approchant...
Avatar
mpg
Le (on) vendredi 15 août 2008 15:41, Marc Espie a écrit (wrote) :

Après essai, j'ai l'impression que ça ne marche plus si je rajoute le
remplace /$motif/ par /$motif/o (par contre ça va en effet plus vite).


Oui, il compile une seule fois.



D'accord. J'avais très vaguement espéré que Perl serait assez rusé pour
comprend que quand je disais "o" je pensais une fois /par boucle/ mais il
ne faut pas trop rêver, hein.

Oui, c'est pas si complique que ca note.

Genre:
for my $motif (@listemotifs) {
my $re = qr/$motif/o;
fairedestrucs if grep $re, @autreliste;
}



Ah oui en effet. Ça avait l'air plus intimidant que ça dans la doc.

et tu peux te passer du $re intermediaire avec un map:
for my $motif (map {qr/$_/o} @listemotifs) {
fairedestrucs if grep $motif, @autreliste;
}

ou approchant...



Bon en fait pas dans mon vrai script, parce qu'à la place du for je lis dans
un fichier et fait un ou deux trucs avec chaque ligne avant d'en extraire
éventuellement un motif, mais je vois l'idée.

Merci !

Manuel.