When an eval
statement is within the scope of a lexical variable, that variable should be within the lexical context of the evaluated block. Moreover, lexical variables should be available in the lexical context of subs.
Yet this doesn't work:
use warnings;
{
package VLE;
my $ln10 = 2.302585092994045684017991454684;
sub reval {
say eval $_[0] if @_;
}
}
package VLE;
reval( q($ln10) );
It results in:
Variable "$ln10" is not available at (eval 1) line 1.
But if I (uselessly) use the lexical variable anywhere in the block, it's suddenly available in the eval:
use warnings;
{
package VLE;
my $ln10 = 2.302585092994045684017991454684;
sub reval {
say eval $_[0] if @_;
my (undef) = $ln10;
return 0
}
}
package VLE;
reval( q($ln10) );
prints
2.30258509299405
Why does this happen?
Edit:
The destruction of references isn't the issue, since this code (which maintains a reference to $ln10
) also fails:
use warnings;
{
package VLE;
my $ln10 = 2.302585092994045684017991454684;
sub reval2 {
say eval $_[0] if @_;
my (undef) = $ln10;
return 0
}
sub reval {
say eval $_[0] if @_;
return 0
}
}
package VLE;
reval( q($ln10) ); # still fails
reval2( q($ln10) ); # works