Discussion:
dynamic backreference
(trop ancien pour répondre)
luc2
2010-06-10 13:52:55 UTC
Permalink
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";
perlgenome
2010-06-10 13:55:01 UTC
Permalink
Post by 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";
Oui et ?
luc2
2010-06-10 14:07:11 UTC
Permalink
Post by perlgenome
Post by 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";
Oui et ?
bin, l'ordinateur refuse d'obeir aux ordres. on dirait qu'il a developpe
sa propre conscience, et qu'il veut de prendre son destin en main. je
lui ordonne de dire "bonjour fabrice", et il prefere dire "bonjour $1"
Nicolas George
2010-06-10 14:11:33 UTC
Permalink
Post by luc2
bin, l'ordinateur refuse d'obeir aux ordres.
Et oui, tu as PERDU.
Paul Gaborit
2010-06-10 15:12:15 UTC
Permalink
À (at) 10 Jun 2010 14:07:11 GMT,
Post by luc2
Post by perlgenome
Post by 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";
Oui et ?
bin, l'ordinateur refuse d'obeir aux ordres. on dirait qu'il a developpe
sa propre conscience, et qu'il veut de prendre son destin en main. je
lui ordonne de dire "bonjour fabrice", et il prefere dire "bonjour $1"
Vous n'êtes vraiment ni très clair ni très rigoureux dans votre
demande... (Sauf bug matériel, un ordinateur fait toujours exactement ce
qu'on lui demande. Si vous pensez qu'il a sa propre conscience, arrêtez
la programmation car vous n'y arriverez jamais. Par ailleurs, un
ordinateur étant bête par nature, il faut lui expliquer clairement et
rigoureusement ce qu'on souhaite qu'il fasse. Et pour être clair et
rigoureux vis-à-vis d'un ordinateur, il faut savoir l'être vis-à-vis de
ses congénères.)

Bon, comme je suis pas trop fatigué ce soir, j'ai essayé de comprendre
ce que vous souhaitiez faire (j'ai donc tenté de faire *votre* boulot)
et j'espère que ma boule de cristal n'est pas trop rouillée (ça rouille
ces trucs-là ?).

Je vous donne un bout de code. Débrouillez-vous pour comprendre pourquoi
ça marche... ou pas.

#######################
use strict;
use warnings;
my $a = 'salut fabrice';
my $b = '"bonjour $1"';

$a =~ s/salut (.*)/$b/ee;
print "$a\n";
#######################
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
luc2
2010-06-10 15:46:18 UTC
Permalink
Post by Paul Gaborit
Je vous donne un bout de code. Débrouillez-vous pour comprendre pourquoi
ça marche... ou pas.
mais pourquoi est-il si mechant
Post by Paul Gaborit
#######################
use strict;
use warnings;
my $a = 'salut fabrice';
my $b = '"bonjour $1"';
$a =~ s/salut (.*)/$b/ee;
print "$a\n";
#######################
merci

y aurait-il une solution sans eval ?
Paul Gaborit
2010-06-10 16:05:36 UTC
Permalink
À (at) 10 Jun 2010 15:46:18 GMT,
Post by luc2
Post by Paul Gaborit
Je vous donne un bout de code. Débrouillez-vous pour comprendre pourquoi
ça marche... ou pas.
mais pourquoi est-il si mechant
Le paragraphe précédent l'expliquait...
Post by luc2
Post by Paul Gaborit
#######################
use strict;
use warnings;
my $a = 'salut fabrice';
my $b = '"bonjour $1"';
$a =~ s/salut (.*)/$b/ee;
print "$a\n";
#######################
merci
y aurait-il une solution sans eval ?
Non. Où est le problème ?
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Olivier Miakinen
2010-06-10 20:46:27 UTC
Permalink
Post by Paul Gaborit
Post by luc2
Post by Paul Gaborit
#######################
use strict;
use warnings;
my $a = 'salut fabrice';
my $b = '"bonjour $1"';
$a =~ s/salut (.*)/$b/ee;
print "$a\n";
#######################
y aurait-il une solution sans eval ?
Non.
Dans un cas aussi simple, il y a :
$a =~ s/salut /bonjour /;

Me gourré-je ?
Post by Paul Gaborit
Où est le problème ?
Ça c'est vrai, ça.
--
Olivier Miakinen
luc2
2010-06-11 18:13:28 UTC
Permalink
Post by Paul Gaborit
Post by luc2
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...
Marc Espie
2010-06-11 19:00:49 UTC
Permalink
Post by luc2
Post by Paul Gaborit
Post by luc2
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...
Le gros souci avec toi, c'est que tu ne dis pas reellement ce que tu veux
faire, pourquoi ca ne te plait et qu'ensuite tu assenes des semi-verites
style "j'aime pas trop eval".

Dans tout script qui fait plus de 5 lignes, il faut un peu reflechir a ce
qu'on veut et se donner les moyens de le faire. Si tu esperes que ca
va marcher par magie, et qu'en plus, tu enleves des bouts de perl, je ne
sais pas trop ce que tu fiches par ici...
luc2
2010-06-12 11:44:06 UTC
Permalink
Post by Marc Espie
Post by luc2
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...
Le gros souci avec toi, c'est que tu ne dis pas reellement ce que tu veux
faire,
je l'ai dit.
Post by Marc Espie
pourquoi ca ne te plait
je viens de le dire.
Post by Marc Espie
et qu'ensuite tu assenes des semi-verites style "j'aime pas trop
eval".
le fait que j'aime une chose ou pas, c'est une verite entiere.
Post by Marc Espie
Dans tout script qui fait plus de 5 lignes, il faut un peu reflechir a ce
qu'on veut et se donner les moyens de le faire.
c'est ce que j'ai fait :

1) mon script est gigantesque, donc, il fait plus de 5 lignes.
2) j'ai rencontre un probleme, donc, j'ai isole mon probleme dans un
script de 5 lignes pour y reflechir et ainsi trouver le moyen de le
resoudre.
Post by Marc Espie
Si tu esperes que ca va marcher par magie,
qu'est-ce qui te faire croire que j'espere cela ?
Post by Marc Espie
et qu'en plus, tu enleves des bouts de perl,
quels bouts de perl ?
Post by Marc Espie
je ne sais pas trop ce que tu fiches par ici...
BOUDOU Joseph
2010-06-12 13:44:08 UTC
Permalink
use strict;

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

my @vars = ($a =~ /salut (.*)/);
$b =~ s/\$(\d+)/$vars[$1-1]/g;
print "$b\n";
--
BOUDOU Joseph <***@matabio.net>
Paul Gaborit
2010-06-13 23:38:16 UTC
Permalink
À (at) 11 Jun 2010 18:13:28 GMT,
Post by luc2
Post by Paul Gaborit
Post by luc2
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/>
luc2
2010-06-14 16:22:53 UTC
Permalink
Post by Paul Gaborit
Post by luc2
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.
Paul Gaborit
2010-06-14 17:45:32 UTC
Permalink
À (at) 14 Jun 2010 16:22:53 GMT,
Post by luc2
Post by Paul Gaborit
Post by luc2
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.
Post by luc2
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/>
luc2
2010-06-15 09:35:49 UTC
Permalink
Post by Paul Gaborit
Post by luc2
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.
Paul Gaborit
2010-06-15 11:36:38 UTC
Permalink
À (at) 15 Jun 2010 09:35:49 GMT,
Post by luc2
Post by Paul Gaborit
Post by luc2
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/>
Oreste
2010-06-17 15:34:56 UTC
Permalink
Post by luc2
bonjour, j'en ai marre.
essaye le suivant:

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

Loading...