use warnings; my %hash = (foo => 'bar', a => 'x'); sub with (\%&) { my ($href, $cref) = @_; *$_ = \$href->{$_} for keys %$href; $cref->(); } print "$_: $hash{$_}\n" for keys %hash; my $z = 6; with %hash, sub { print "** $foo **!\n"; $a = 5; $z = 'changed lexical'; } ; print "$_: $hash{$_}\n" for keys %hash; print "Z is $z\n";