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 #### my $v = $v;