use Data::Dump qw[ pp ]; ... sub match ($$$) { no strict 'refs'; my ($lhs, $rhs, $fun) = @_; my $locals = {}; # populate locals match_inner($lhs, $rhs, $locals); while (my ($k, $v) = each %$locals) { local ${$k} = $v; } pp $locals; return $fun->(); } #### C:\test>1114414.pl Name "main::bob" used only once: possible typo at C:\test\1114414.pl line 52. { bob => 45 } Use of uninitialized value $bob in print at C:\test\1114414.pl line 52.