Only variables referenced by a sub are captured by a sub.
use strict; use warnings; use feature qw( say ); sub f { my $x = shift; return sub { $x }; } sub g { my $y = shift; return sub { eval '$y' }; } sub h { my $z = shift; return sub { $z if 0; eval '$z' }; } say f( 4 )->() // "[undef]"; say f( 5 )->() // "[undef]"; say "--"; say g( 6 )->() // "[undef]"; say g( 7 )->() // "[undef]"; say "--"; say h( 8 )->() // "[undef]"; say h( 9 )->() // "[undef]";
4 5 -- Variable "$y" is not available at (eval 1) line 1. [undef] Variable "$y" is not available at (eval 2) line 1. [undef] -- 8 9
This is an optimization as capturing everything every time would have drawbacks.
I can't explain the behaviour you are seeing, but the bug you are encountering is surely related to this optimization.
In any case, adding the following to your outer eval works around the issue:
my $v = $v;
In reply to Re: Lexical variable not available
by ikegami
in thread Lexical variable not available
by choroba
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |