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