sub hmap(&@) { my $cb = shift; my $caller = caller(); my $kgr = do { no strict 'refs'; \*{$caller.'::k'} }; my $vgr = do { no strict 'refs'; \*{$caller.'::v'} }; local *$kgr = \my $k; local *$vgr = \my $v; for (...) { $k = ...; $v = ...; $cb->(); } }