It is getting deleted. If you print the hash after the loop (well, anytime after the delete), you'll notice it only has two keys.
foreach my $id (sort keys %test) { delete $test{13}; } print(scalar keys %test, "\n"); # 2
Your code is equivalent to
@anon_list = sort keys %test; foreach my $id (@anon_list) { print "$id :: $test{$id}\n"; delete $test{13}; }
The problem is that you are deleting the key from %test, but not from the list over which foreach is iterating (@anon_list). That list is built when the loop is entered, before delete is called.
A solution is to check if the key still exists when you get around to visiting it.
foreach my $id (sort keys %test) { next if not exist $test{$id}; print "$id :: $test{$id}\n"; delete $test{13}; }
In reply to Re: delete hash key while hash in use
by ikegami
in thread delete hash key while hash in use
by rsiedl
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |