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

Get Perl Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.