How to use foreach loop to iterate over hash keys in Perl?

Question

How to use foreach loop to iterate over hash keys in Perl?

In Perl, the foreach loop is a versatile control structure used for iterating over lists. Since hashes are key-value stores, when you want to loop over the keys of a hash, you can obtain a list of keys using the built-in keys function. Then you use foreach (also equivalent to for) to iterate through each key and access its associated value.

Basic Syntax: Iterating Over Hash Keys

Here’s the general pattern to iterate over all keys in a hash:


foreach my $key (keys %hash) {
    # Access $hash{$key} here
}

Inside the loop:

  • $key is a scalar variable holding the current hash key (notice the $ sigil for scalars).
  • %hash is the original hash variable (remember the % sigil for hashes).
  • You can then use $hash{$key} to access the corresponding value associated with that key.

Complete Example

This example illustrates iterating over a hash's keys, printing each key and its value:


use strict;
use warnings;

my %fruit_colors = (
    apple  => 'red',
    banana => 'yellow',
    grape  => 'purple',
);

foreach my $key (keys %fruit_colors) {
    print "The color of $key is $fruit_colors{$key}.\n";
}

If you run this code (e.g., save to colors.pl and run perl colors.pl), you'll see output similar to:

The color of apple is red.
The color of banana is yellow.
The color of grape is purple.

Note: The order of keys returned by keys is not guaranteed. If you need sorted keys, you can iterate as:


foreach my $key (sort keys %fruit_colors) {
    print "$key: $fruit_colors{$key}\n";
}

Perl Concepts Highlighted

  • Sigils: % for hash variables, $ for scalar elements (hash values accessed by a key).
  • Context: keys %hash returns a list of all the keys; used here in list context for iteration.
  • TMTOWTDI ("There's more than one way to do it"): You can replace foreach with for, or even use a traditional while loop with each for iteration.

Common Gotchas

  • Key order is random: keys does not return keys in insertion order. Use sort if order matters.
  • Modifying hash during iteration: Don't add or remove keys from a hash while iterating over it with keys as that can lead to unpredictable behavior.
  • Using wrong sigil: Remember to use $ with a hash element like $hash{$key}, not %.

In summary, using foreach with keys %hash is the most straightforward way to loop over hash keys and process associated values in Perl. This idiom is common, efficient, and easy to read for beginners and experts alike.

Verified Code

Executed in a sandbox to capture real output. • v5.34.1 • 5ms

Tip: edit code and use “Run (Browser)”. Server runs always execute the published, verified snippet.
STDOUT
(empty)
STDERR
(empty)

Was this helpful?

Related Questions