The documentation for each() says that we can only delete the
most recent key without ill effects, whereas the perlfaq answer
made it sound as if we can delete any key. 


albook_brian[731]$ cvs diff -u -d perlfaq4.pod
Index: perlfaq4.pod
===================================================================
RCS file: /cvs/public/perlfaq/perlfaq4.pod,v
retrieving revision 1.55
diff -u -d -r1.55 perlfaq4.pod
--- perlfaq4.pod        11 Oct 2004 05:06:29 -0000      1.55
+++ perlfaq4.pod        30 Oct 2004 12:06:35 -0000
@@ -1715,19 +1715,15 @@
 
 =head2 What happens if I add or remove keys from a hash while
iterating over it?
 
-Don't do that. :-)
+(contributed by brian d foy)
 
-[lwall] In Perl 4, you were not allowed to modify a hash at all while
-iterating over it.  In Perl 5 you can delete from it, but you still
-can't add to it, because that might cause a doubling of the hash table,
-in which half the entries get copied up to the new top half of the
-table, at which point you've totally bamboozled the iterator code.
-Even if the table doesn't double, there's no telling whether your new
-entry will be inserted before or after the current iterator position.
+The easy answer is "Don't do that!"
 
-Either treasure up your changes and make them after the iterator
finishes
-or use keys to fetch all the old keys at once, and iterate over the
list
-of keys.
+If you iterate through the hash with each(), you can delete the key
+most recently returned without worrying about it.  If you delete or add
+other keys, the iterator may skip or double up on them since perl
+may rearrange the hash table.  See the
+entry for C<each()> in L<perlfunc>.
 
 =head2 How do I look up a hash element by value?

-- 
brian d foy, [EMAIL PROTECTED]

Reply via email to