my %foo; @foo{qw/ foo bar baz /} = 1 .. 3; printf "%%foo = %s { %s } = ( %s )\n",\%foo,scalar %foo, join(",",map "$_ => $foo{$_}",keys %foo); while (%foo) { my $key = each %foo; my $val = delete $foo{$key}; printf "%s => %s is gone.\n", $key, $val; printf "%%foo = %s { %s } = ( %s )\n",\%foo,scalar %foo, join(",",map "$_ => $foo{$_}",keys %foo); } #### %foo = HASH(0x1ab298c) { 2/8 } = ( foo => 1,baz => 3,bar => 2 ) foo => 1 is gone. %foo = HASH(0x1ab298c) { 1/8 } = ( baz => 3,bar => 2 ) baz => 3 is gone. %foo = HASH(0x1ab298c) { 1/8 } = ( bar => 2 ) bar => 2 is gone. %foo = HASH(0x1ab298c) { 0 } = ( )