sub gen_each_iter(\%) { my ($hash) = @_; my @keys = keys(%$hash); return sub { return if not @keys; my $key = shift(@keys); return wantarray ? ($key, $hash->{$key}) : $key; }; }; my $each = gen_each_iter(%foo); while (my ($key, $val) = $each->()) { ... }