sub foreach_pair (&\%) { my ($coderef, $hashref) = @_; local ($a, $b); keys %$hashref; while ( ($a, $b) = each %$hashref ) { $coderef->($a, $b) }; }; my %foo = (a => 1, b => 2, c => 3); # if you don't mind remembering what $a and $b are foreach_pair { print "$a == $b\n" } %foo; # or if you prefer being explicit foreach_pair { my ($name, $value) = @_; print "name $name is $value\n" } %foo;