eval + return = fin du monde
Le
luc2
#!/usr/bin/perl
use strict;
# bonjour, je pensais empecher la fin du monde en utilisant "return",
# mais j'ai echoue. je comprends a peu pres le pourquoi du comment,
# mais j'ai pas apprecie le piege
sub fin_du_monde
{
eval
{
return "je quitte la fonction pour eviter la fin du monde";
};
return "destruction de l'univers";
}
print fin_du_monde;
use strict;
# bonjour, je pensais empecher la fin du monde en utilisant "return",
# mais j'ai echoue. je comprends a peu pres le pourquoi du comment,
# mais j'ai pas apprecie le piege
sub fin_du_monde
{
eval
{
return "je quitte la fonction pour eviter la fin du monde";
};
return "destruction de l'univers";
}
print fin_du_monde;

Poser une question


luc2
Ce n'est pas un piège et c'est documenté (dans perlfunc à la section
'eval'). Un 'return' au plus haut niveau du contenu d'un 'eval' (que ce
soit un bloc comme dans votre cas ou une chaîne) définit le résultat du
'eval'.
Le bout de code suivant :
$a = eval {return 42};
print "$an";
affichera 42.
--
Paul Gaborit - Perl en français -
il suffit de changer peu de choses : un return en die et un test
#!/usr/bin/perl
use strict;
# bonjour, je pensais empecher la fin du monde en utilisant "return",
# mais j'ai echoue. je comprends a peu pres le pourquoi du comment,
# mais j'ai pas apprecie le piege...
sub fin_du_monde
{
eval
{
die "Argh ....n";
};
if ($@) {
return "je quitte la fonction pour eviter la fin du monden";
}
return "destruction de l'universn";
}
print fin_du_monde;
le fait que ce soit documente, explicable ou comprehensible n'empeche pas que
ce soit un piege.
c'est comme les faux-amis entre 2 langues differentes : c'est documente,
explicable et comprehensible, et pourtant, ce sont des pieges.
Bof, bof, bof.
C'est perl, hein. entre last, next, return, eval, die, ca offre pas mal
de possibilites de confusions semantiques (le fonctionnement d'eval/die/$@
est suffisamment complexe pour avoir suscite "quelques" modifications dans les
perl recents, par exemple).
Si c'est un "piege" pour toi, tu n'es pas au bout de tes amusements.
luc2
Ça ne prête à confusion que pour ceux qui ont des idées préconçues sur
le fonctionnement de 'return' et de 'eval'.
Vu l'endroit où c'est documenté (à la fois dans 'eval' et dans
'return'), le fait de dire que c'est un piège est en fait un jugement de
valeur (sur celui qui tombe dedans).
Il existe de vrais pièges en Perl (commme dans tous les autres langages)
qui, eux, sont mal ou pas documentés du tout. Par exemple, le piège des
fuites mémoires liées aux références circulaires n'est qu'évoqué dans
perlref avec un renvoi vers perlobj qui l'explique un peu mieux mais ne
fournit pas de solution. Ça, c'est un vrai piège du langage difficile à
comprendre et difficile à résoudre.
--
Paul Gaborit - Perl en français -