in reply to delete hash key while hash in use

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}; }