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->(); } } #### ... = hmap { our($k,$v); ... } ...; #### ... = hmap { my($k,$v)=@_; ... } ...; #### package Hash::Map; use Exporter qw( import ); our @EXPORT = qw( $k $v hmap hgrep ); sub hmap(&@) { ... } sub hgrep(&@) { ... } 1;
## ... = hmap { our($k,$v); ... } ...; ##
## ... = hmap { my($k,$v)=@_; ... } ...; ##
## package Hash::Map; use Exporter qw( import ); our @EXPORT = qw( $k $v hmap hgrep ); sub hmap(&@) { ... } sub hgrep(&@) { ... } 1;