start page | rating of books | rating of authors | reviews | copyrights

Perl Cookbook

Perl CookbookSearch this book
Previous: 5.2. Testing for the Presence of a Key in a Hash Chapter 5
Hashes
Next: 5.4. Traversing a Hash
 

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


Previous: 5.2. Testing for the Presence of a Key in a Hash Perl Cookbook Next: 5.4. Traversing a Hash
5.2. Testing for the Presence of a Key in a Hash Book Index 5.4. Traversing a Hash