in reply to Ouch! Each! Reentrant it is not
Solution: Either go through the whole hash, or rewind it after using each:
I once worked on a largish codebase that had this as the cause of several bugs in various places. We ended up using variations of things like:
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;
To avoid the problem and make things a bit more explict.
|
|---|