use strict; use warnings; BEGIN { package MyVars; use Exporter::Shiny; use B::Hooks::EndOfScope; sub import { no strict "refs"; my $caller = caller; my $old_value = ${"$caller\::pi"}; *{"$caller\::pi"} = do { my $new_value = 3.14159; \$new_value }; on_scope_end { *{"$caller\::pi"} = \$old_value; } } }; use Data::Dumper; { use MyVars; BEGIN { print Dumper($pi) } } BEGIN { print Dumper($pi) } #### use strict; use warnings; BEGIN { package MyVars; use Exporter::Shiny; use B::Hooks::Parser; our $pi = 3.14195; sub import { B::Hooks::Parser::inject(sprintf('my $pi; BEGIN { $pi = $%s::pi };', __PACKAGE__)); } }; use Data::Dumper; my $pi = 3; { use MyVars; print Dumper($pi); } print Dumper($pi);