It means you've already started iterating over the hash.
sub _split_options { my ($opts) = @_; while (my ($k, $v) = each %$opts) { print "$k = $v\n"; } print("\n"); while (my ($k, $v) = each %$opts) { print "$k = $v\n"; } } my %opts = qw( a 1 b 2 c 3 d 4 ); scalar each %opts; _split_options(\%opts);
a = 1 b = 2 d = 4 c = 3 a = 1 b = 2 d = 4
So no, it's not a bug in while, or even with each. It's a bug in your use of each. Whenever you use each, you should reset the iterator first. You can do that efficiently by calling keys in void context first.
sub _split_options { my ($opts) = @_; keys %$opts; # Reset iterator while (my ($k, $v) = each %$opts) { print "$k = $v\n"; } print("\n"); #keys %$opts; # Previous loop reset iterator while (my ($k, $v) = each %$opts) { print "$k = $v\n"; } } my %opts = qw( a 1 b 2 c 3 d 4 ); scalar each %opts; _split_options(\%opts);
c = 3 a = 1 b = 2 d = 4 c = 3 a = 1 b = 2 d = 4
In reply to Re: Found bug: while()
by ikegami
in thread Found bug: while()
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |