OVH Cloud OVH Cloud

probleme d'evaluation

2 réponses
Avatar
GERBIER Eric
bonjour

je cherche a ecrire une fonction qui prend en argument 2 valeurs et un operateur
et qui renvoie le resultat du test :

my $test = mon_test( 5, '>', 1); # renvoie vrai
my $test = mon_test( 'a', 'eq', 'b'); # renvoie faux

je soupconne qu'il faut utiliser la fonction eval, mais mes differents essais ne
passent pas l'analyse syntaxique ...

un bout de code svp ?

2 réponses

Avatar
Paul GABORIT
À (at) Wed, 16 Jun 2004 17:20:05 +0200,
GERBIER Eric écrivait (wrote):
je cherche a ecrire une fonction qui prend en argument 2 valeurs et un
operateur et qui renvoie le resultat du test :

my $test = mon_test( 5, '>', 1); # renvoie vrai
my $test = mon_test( 'a', 'eq', 'b'); # renvoie faux

je soupconne qu'il faut utiliser la fonction eval, mais mes differents
essais ne passent pas l'analyse syntaxique ...


sub mon_test {
my ($l, $op, $r) = @_;

return eval "$l $op $r";
}

C'est une fonction potentiellement dangereuse (puisque on évalue les valeurs
de $l et $r)... comme dans tous les cas où on utilise un construction de la
forme : eval "..."

On peut la sécuriser de la manière suivante (si on connait à l'avance les
opérateurs possibles) :

sub mon_test {
my ($l, $op, $r) = @_;

my %hsub = (
'>' => sub {$l > $r},
'eq' => sub {$l eq $r},
# ...
);

return $hsub{$op}();
}


--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
GERBIER Eric
Paul GABORIT wrote:

On peut la sécuriser de la manière suivante (si on connait à l'avance les
opérateurs possibles) :

sub mon_test {
my ($l, $op, $r) = @_;

my %hsub = (
'>' => sub {$l > $r},
'eq' => sub {$l eq $r},
# ...
);

return $hsub{$op}();
}


merci pour cette reponse toujours aussi precise et efficace !

cette nuit, je suis tombé sur "programmation avancé en perl", avec tout un
chapitre sur eval : je vais m'y mettre.