- Notifications
You must be signed in to change notification settings - Fork587
Open
Labels
Description
Perl v5.30.0
eval "string" in package DB is supposed to be evaluated in the nearest non-DB context, useful for debug tools. However when code in package DB is called from a nested lexical ("my") sub,only the lexicals in the innermost sub are visible; globals and lexicals in enclosing scopes can no longer be accessed.
(This may seem obscure, but it is important to me because I use some debugging tools which depend on eval in package DB being able to see user-defined lexicals).
The output from the following script is:
$w_from_outer = 41;$x_from_outer = 42;$y_from_outer = 43;$w_from_inner = undef;$x_from_inner = undef;$y_from_inner = undef;$z_from_inner = 44;
and here is the script:
!/usr/bin/perluse strict; use warnings; use v5.18; use Data::Dumper;our $w = 41;my $x = 42;my ($w_from_outer, $x_from_outer, $y_from_outer, $w_from_inner, $x_from_inner, $y_from_inner, $z_from_inner);sub outer { my $y = 43; $w_from_outer = &DB::doeval('$w'); $x_from_outer = &DB::doeval('$x'); $y_from_outer = &DB::doeval('$y'); my sub inner { my $z = 44; $w_from_inner = &DB::doeval('$w'); # gets undef $x_from_inner = &DB::doeval('$x'); # gets undef $y_from_inner = &DB::doeval('$y'); # gets undef $z_from_inner = &DB::doeval('$z'); } inner();}outer();say Data::Dumper->Dump( [ $w_from_outer, $x_from_outer, $y_from_outer, $w_from_inner, $x_from_inner, $y_from_inner, $z_from_inner ], [qw( w_from_outer x_from_outer y_from_outer w_from_inner x_from_inner y_from_inner z_from_inner )] ); package DB;sub doeval($) { return eval $_[0];}