Deleting from a Hash
Problem
You want to remove an entry from a hash so that it doesn't show up with keys
, values
, or each
. If you were using a hash to associate salaries with employees, and an employee resigned, you'd want to remove their entry from the hash.
Solution
# remove $KEY and its value from %HASH delete($HASH{$KEY});
Discussion
Sometimes people mistakenly try to use undef
to remove an entry from a hash. undef
$hash{$key}
and $hash{$key}
=
undef
both make %hash
have an entry with key $key
and value undef
.
The delete
function is the only way to remove a specific entry from a hash. Once you've deleted a key, it no longer shows up in a keys
list or an each
iteration, and exists
will return false for that key.
This demonstrates the difference between undef
and delete
:
# %food_color as per Introduction sub print_foods { my @foods = keys %food_color; my $food; print "Keys: @foods\n"; print "Values: "; foreach $food (@foods) { my $color = $food_color{$food}; if (defined $color) { print "$color "; } else { print "(undef) "; } } print "\n"; } print "Initially:\n";print_foods();
print "\nWith Banana undef\n"; undef $food_color{"Banana"};print_foods();
print "\nWith Banana deleted\n"; delete $food_color{"Banana"};print_foods();
Initially:
Keys: Banana Apple Carrot Lemon
Values: yellow red orange yellow
With Banana undef
Keys: Banana Apple Carrot Lemon
Values: (undef) red orange yellow
With Banana deleted
Keys: Apple Carrot Lemon
Values: red orange yellow
As you see, if we set $food_color{"Banana"}
to undef
, "Banana"
still shows up as a key in the hash. The entry is still there; we only succeeded in making the value undef
. On the other hand, delete
actually removed it from the hash - "Banana"
is no longer in the list returned by keys
.
delete
can also take a hash slice, deleting all listed keys at once:
delete @food_color{"Banana", "Apple", "Cabbage"};
See Also
The delete
and keys
functions in perlfunc (1) and in of Perl Developing; we use keys in