in reply to Lexical variable not available

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;

Replies are listed 'Best First'.
Re^2: Lexical variable not available
by ikegami (Patriarch) on Mar 19, 2024 at 19:57 UTC

    but the bug you are encountering is surely related to this optimization.

    It could be. But the more I think of this, the more I think it might not necessarily be the case.

    Well, at least the reader now knows the common cause of this error.