OVH Cloud OVH Cloud

dynamic backreference

16 réponses
Avatar
luc2
bonjour, j'en ai marre.

#!/usr/bin/perl

use strict;

my $a = 'salut fabrice';
my $b = 'bonjour $1';

$a =~ s/salut (.*)/$b/;
print "$a\n";

6 réponses

1 2
Avatar
Paul Gaborit
À (at) 11 Jun 2010 18:13:28 GMT,
luc2 écrivait (wrote):

Le 10-06-2010, Paul Gaborit a écrit :

y aurait-il une solution sans eval ?



Non. Où est le problème ?



bin, j'aime pas trop eval... ca me force a verifier le contenu des
variables... sinon, l'utilisateur peut executer tout ce qu'il veut dans
mon prog...



Ok, il faut toujours se méfier de ce que donne l'utilisateur... Mais
dans votre exemple, aucune variable ne provient d'une donnée de
l'utilisateur.

Alors où est le problème ?

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
luc2
Le 13-06-2010, Paul Gaborit a écrit :

bin, j'aime pas trop eval... ca me force a verifier le contenu des
variables... sinon, l'utilisateur peut executer tout ce qu'il veut dans
mon prog...



Ok, il faut toujours se méfier de ce que donne l'utilisateur... Mais
dans votre exemple, aucune variable ne provient d'une donnée de
l'utilisateur.

Alors où est le problème ?



mon exemple n'etait qu'un petit programme pour isoler le probleme. dans
le programme complet, les donnees sont fournies par l'utilisateur.
Avatar
Paul Gaborit
À (at) 14 Jun 2010 16:22:53 GMT,
luc2 écrivait (wrote):

Le 13-06-2010, Paul Gaborit a écrit :

bin, j'aime pas trop eval... ca me force a verifier le contenu des
variables... sinon, l'utilisateur peut executer tout ce qu'il veut dans
mon prog...



Ok, il faut toujours se méfier de ce que donne l'utilisateur... Mais
dans votre exemple, aucune variable ne provient d'une donnée de
l'utilisateur.

Alors où est le problème ?



mon exemple n'etait qu'un petit programme pour isoler le probleme.



L'exemple isolait un peu trop le problème puisque les solutions
proposées ne conviennent pas.

dans le programme complet, les donnees sont fournies par
l'utilisateur.



Lesquelles ? Si tout est donné par l'utilisateur, il n'y a pas que le
'eval' qui pose problème.

Si vous voulez qu'on vous aide à trouver une solution, il faudrait mieux
nous en dire un peu plus...

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
luc2
Le 14-06-2010, Paul Gaborit a écrit :

dans le programme complet, les donnees sont fournies par
l'utilisateur.



Lesquelles ? Si tout est donné par l'utilisateur, il n'y a pas que le
'eval' qui pose problème.



tout est donne par l'utilisateur : la chaine a analyser, la chaine a
rechercher, la chaine de remplacement.
Avatar
Paul Gaborit
À (at) 15 Jun 2010 09:35:49 GMT,
luc2 écrivait (wrote):

Le 14-06-2010, Paul Gaborit a écrit :

dans le programme complet, les donnees sont fournies par
l'utilisateur.



Lesquelles ? Si tout est donné par l'utilisateur, il n'y a pas que le
'eval' qui pose problème.



tout est donne par l'utilisateur : la chaine a analyser, la chaine a
rechercher, la chaine de remplacement.



C'est donc l'utilisateur qui donne l'expression rationnelle recherchée
et la chaîne de remplacement contenant d'éventuels $1, $2, etc. Pour
que ça puisse marcher il faut déja s'assurer qu'il y a le bon nombre de
groupes capturés par la regexp.

De plus, si Perl interpole lui-même les $1, $2, etc. il sera difficile
de l'empêcher d'interpoler aussi d'autres constructions comme
@{[...code...]} (qui est un 'eval' implicite).

Donc pour faire ce que vous voulez de manière sécurisée et fiable, il
faudra réaliser vous-même l'interpolation sans passer par les mécanismes
de Perl. Cela ne s'écrit plus en quelques lignes de Perl.

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
Oreste
On Jun 10, 3:52 pm, luc2 wrote:
bonjour, j'en ai marre.



essaye le suivant:

use strict;
my $a = 'salut fabrice';
my $b = 'bonjour';
$a =~ s/salut (.*)/$b $1/;
print "$an";
1 2