Here's another example:
# foo.pl
use strict;
use warnings;
require 'bar.pl';
frobozz( 2 );
__END__
# bar.pl
use strict;
use warnings;
{
my $x; # same thing with "my $x = 'whatever';"
frobozz( 1 ) unless caller;
sub frobozz {
( $x ) = @_;
print 'NOT ' unless defined eval( '$x' );
print "OK\n";
quux();
}
sub quux {
# $x = $x;
print 'NOT ' unless defined eval( '$x' );
print "OK\n";
}
}
1;
__END__
If one runs foo.pl, the output is
OK
NOT OK
...meaning that
frobozz sees
$x but
quux doesn't. If one uncomments the commented line in
quux or runs
bar.pl directly, the output is
OK
OK
(This is true for both 5.8.6 and 5.8.8 on Linux.)
After re-reading the docs on eval, I can't see how a programmer can be expected to predict this behavior. Therefore, it is, at the very least, a design bug, IMO.