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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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...
In article <g83u3h$1sp3$1@talisker.lacave.net>, mpg <mpg@elzevir.fr> 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...
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 (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.
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() ?
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
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...
In article <g840cj$25rn$1@talisker.lacave.net>, mpg <mpg@elzevir.fr> 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;
}
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 (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.
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.
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.