variables intermediate

How to use the each() function to iterate over a hash in Perl?

Question

How to use the each() function to iterate over a hash in Perl?

Using the each() Function to Iterate Over a Hash in Perl

In Perl, hashes (associative arrays) store key-value pairs, and iterating over them is a common operation. One efficient way to traverse a hash is using the built-in each() function. This function returns key-value pairs from the hash one at a time, allowing you to loop through all entries easily.

How each() Works

each %hash returns a two-element list consisting of a key and its corresponding value from the hash on each call. When the hash is exhausted, each() returns an empty list, which makes it ideal for use in a while loop. Internally, each() maintains an iterator state for the hash, remembering which element to return next.

Here’s what happens step-by-step:

  • Call each %hash - returns a key and value pair.
  • Loop continues, getting the next key/value on subsequent each calls.
  • When no more elements remain, each returns an empty list, ending the loop.

Key Notes About each():

  • Context: In scalar context, each returns just the key or undef when finished.
  • Iterator Reset: The internal iterator resets automatically at end or when the hash is modified.
  • Perl Versions: each has been in Perl since very early versions (before 5.10). Changes in recent versions improved internal iterator behavior but basics remain stable.
  • Not Ordered: Hashes are unordered, so elements come in arbitrary order. If order is important, use keys sorted.

Common Pitfalls

  • Using each on a hash modified during iteration can cause unexpected behavior or reset the iterator.
  • Calling each multiple times on the same hash in nested loops without resetting can produce confusion.
  • Don’t assume order of iteration; hash ordering is random unless sorting keys explicitly.

Example: Using each() to Iterate a Hash


#!/usr/bin/perl
use strict;
use warnings;

# Define a sample hash
my %fruit_color = (
    apple  => 'red',
    banana => 'yellow',
    grape  => 'purple',
    lemon  => 'yellow',
);

# Iterate using each() in a while loop
while (my ($fruit, $color) = each %fruit_color) {
    print "The color of $fruit is $color\n";
}

# After iteration ends, you can reset the iterator by calling keys()
keys %fruit_color; # reset iterator if needed

# Demonstrate scalar context behavior
my $key;
while (defined($key = each %fruit_color)) {
    print "Got key: $key\n";
}

Running this script will print all fruit-color pairs in arbitrary order, using each() to retrieve one key-value pair per loop iteration.

Summary

The each() function is a clean and idiomatic way to iterate over a hash’s key-value pairs in Perl. Remember it:

  • Returns a two-element list (key and value) on each call in list context.
  • Works well inside a while loop.
  • Maintains an internal iterator and resets on hash modification or explicit calls.
  • Does not guarantee order—use sort keys %hash if order matters.

Mastering each() will make your Perl hash handling more efficient and idiomatic.

Verified Code

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

Tip: edit code and use “Run (Browser)”. Server runs always execute the published, verified snippet.
STDOUT
The color of apple is red
The color of lemon is yellow
The color of grape is purple
The color of banana is yellow
Got key: apple
Got key: lemon
Got key: grape
Got key: banana
STDERR
(empty)

Was this helpful?

Related Questions