use Data::Dumper;
package Foo;
$foo="bar";
sub quux { print "\$foo is '$foo'\n" }
package main;
my %Foo_save = %Foo::;
print "-1-\n",Dumper \%Foo::;
eval "\$Foo::bar = q{quux}";
print "-2-\n",Dumper \%Foo::;
print "-3-\n",Dumper \%Foo_save;
%Foo:: = %Foo_save;
print "-4-\n",Dumper \%Foo::;
Foo::quux();
eval "print \"but Foo::bar is '\$Foo::bar'\\n\"";
__END__
-1-
$VAR1 = {
'quux' => *Foo::quux,
'foo' => *Foo::foo
};
-2-
$VAR1 = {
'bar' => *Foo::bar,
'quux' => *Foo::quux,
'foo' => *Foo::foo
};
-3-
$VAR1 = {
'quux' => *Foo::quux,
'foo' => *Foo::foo
};
-4-
$VAR1 = {
'quux' => *Foo::quux,
'foo' => *Foo::foo
};
$foo is 'bar'
but Foo::bar is ''
That fails if eval'ed code populates a scalar slot of an already present typeglob - if, for instance, the subroutine in Foo was named 'bar', then $Foo::bar would retain the value set in the string eval. Hmm.. maybe Clone would help? |