sub capture {\@_}; # the eval here returns 1 to make for a cheap check for success. # we could check $@ but why bother? sub readonly{ my $v=$_[0]; eval{$_[0]=$v;1} ? 0 : 1 } $\="\n"; print "No eval :",readonly(capture(5)->[0]); eval ' print "In str eval :",readonly(capture(5)->[0]); '; eval { print "In block eval :",readonly(capture(5)->[0]); }; print "Block Eval ret :",readonly(eval{capture(5)}->[0]); print "Str Eval ret :",readonly(eval'capture(5)'->[0]); #### No eval :1 In str eval :1 In block eval :1 Block Eval ret :1 Str Eval ret :0