ne pas recompiler une regex

Le
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.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
espie
Le #16553041
In article
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...
mpg
Le #16553331
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.
espie
Le #16553391
In article
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...
mpg
Le #16553631
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.
Publicité
Poster une réponse
Anonyme