On Sun, Nov 02, 2003 at 12:20:11AM -0600, Andy Lester wrote: > >>Anything that uses the C<each> operator is a prime candidate for > >>bugginess. Please keep an eye out for them as you do your testing. > >>Any function that contains C<each> oughta be heavily checked. > >> > >>Ditto anything that uses C<keys> or C<values> without a sort. > > Elaborating: Code that uses C<each>, C<keys> or C<values> may have > worked in the past because the order of elements would be the same > between runs. For instance, you have one hash, and then another hash > with the same keys, and the code relies on those keys being in the same > order between the hashes. This reliance might be explicit or > accidental. Now, with 5.8.1 randomizing hashes, that code may break. > > Also, in .t files, it'd be a good thing to not rely on each/keys/values > when determining the order of tests, because subsequent test runs might > not be in the same order. For example: > > my %tests = ( test1 => 'foo', test2 => 'bar', etc.... ); > > while ( my($key,$val) = each %tests ) { > # do a test > } > > The order in which these tests are done will be different between runs > of the code...
A separate issue with C<each> is that code using it generally assumes that the has itterator is at the start of the hash. If it's not (because an C<each> loop somewhere terminated early, for example) then some items of the hash will be skipped. A very hard to find bug. Its cheap to reset an itterator, just do keys %foo; before the C<each> loop. But rather than post emails with such guidelines, only for them to be lost in the sands of time, wouldn't it be better to update the web site? Tim.