Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked

Re: i don't understand this scope behavior w/ closures and eval

by crashtest (Curate)
on Feb 11, 2010 at 22:33 UTC ( #822773=note: print w/replies, xml ) Need Help??

in reply to i don't understand this scope behavior w/ closures and eval

Why turn warnings off? Turning them on (and autoflushing STDOUT and STDERR, so the output is in order) prints:

Useless use of private variable in void context at line 27 +. factory: 'lulz' eval: 'lulz' factory: 'frunz' Variable "$var" is not available at (eval 2) line 1. Use of uninitialized value $var in concatenation (.) or string at (eva +l 2) line 1. eval: '' factory: 'lulz' eval: 'lulz'

In the first factory, you're using $var in an eval{} block... which is quite different from a string eval(). This isn't an interesting case, and works as you expected anyway.

The difference between your second and third examples is the supposedly useless (as perl tells you) statement $var. The compressed answer is that when you generate the closure in these latter cases, perl has no idea that you're making use of $var in your block, and so it sees no reason to include it in the closure.

After all, all perl sees is a string and some function call (to eval()). But when you explicitly make use of $var in your (third) factory, perl includes it in the closure - not because it knows you're going to need it, but because you included it. When the string eval is then evaluated, it finds $var in the third factory, but can't resolve it in the second factory.

To make sure it is clear what I am referencing from a closure, I always like to explicitly write out which variables I need for it... I'd write something like:

return sub{ my ($code) = ($var); my $estr = "print \"eval: '\$code'\n\""; eval $estr; }

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://822773]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (3)
As of 2020-06-07 07:12 GMT
Find Nodes?
    Voting Booth?
    Do you really want to know if there is extraterrestrial life?

    Results (42 votes). Check out past polls.