Deleting from a Hash (Perl Cookbook, 2nd Edition)

## 5.4. Deleting from a Hash

### 5.4.1. 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.

### 5.4.2. Solution

Use the `delete` function:

>     # remove $KEY and its value from %HASH
>     delete($HASH{$KEY});

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

### 5.4.4. See Also

The `delete` and `keys` functions in perlfunc(1) and in Chapter 29 of Programming Perl; we use keys in Recipe 5.5

Copyright © 2003 O'Reilly & Associates. All rights reserved.