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
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/>
À (at) Wed, 16 Jun 2004 17:20:05 +0200,
GERBIER Eric <eric_nospam_gerbier@meteo.fr> é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/>
À (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/>
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.
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.