Recipe 5.3. Deleting from a Hash
Author: Tom Christiansen & Nathan Torkington
Date: 1999-07-02T01:32:32Z

#

| Chapter 5 Hashes |

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

Use the `delete` function:

    # 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 Chapter 3 of Programming Perl; we use keys in Recipe 5.4

5.2. Testing for the Presence of a Key in a Hash |  | 5.4. Traversing a Hash