in reply to Re: Scope problem in closures with an eval statement
in thread Scope problem in closures with an eval statement

No, the problem is that $k is not available (slightly different than garbage collected). It is included in the closure, as this demonstrates:
use strict; use warnings; $::clos = $::clos = "global"; sub foo { my $clos = shift; my $sub = shift; &$sub() if $sub; return sub { eval 'print "$clos\n"' } } foo("baz", foo("bar"));
The first (inside) call to foo returns a closure on foo's $clos. The second call to foo calls the closure, which does get the closed-over $clos. But there is a problem: entering foo the second time reuses the same lexical $clos, since perl isn't aware that the first call will be referring to it, so as an optimization doesn't bother allocating a new lexical.

Note that in 5.10.0, the OP's problem code gives a warning:

Variable "$k" is not available at (eval 1) line 1.