variables intermediate

How to create an anonymous hash in Perl?

Question

How to create an anonymous hash in Perl?

In Perl, an anonymous hash is a hash data structure created without assigning it directly to a named variable. Instead, you create a reference to a hash, which is essentially a scalar containing the memory address of an unnamed hash. This is useful for creating complex data structures or passing hashes around without copying all data.

Creating an Anonymous Hash

You create an anonymous hash by using curly braces { } instead of parentheses ( ). Using { key => value, ... } creates a hash reference rather than a plain hash. For example:


my $anon_hash_ref = { 
    name => 'Alice', 
    age  => 30, 
    city => 'New York' 
};

Here, $anon_hash_ref is a scalar holding a reference to the hash. This is contrasted with a named hash, which you would declare with:


my %hash = (
    name => 'Alice', 
    age  => 30, 
    city => 'New York'
);

Dereferencing an Anonymous Hash

To access elements in the anonymous hash, you dereference the reference variable:

  • $anon_hash_ref->{key} accesses a value by key.
  • Alternatively, you can use %$anon_hash_ref to get the whole hash if needed.

Why Use Anonymous Hashes?

  • TMTOWTDI (There's More Than One Way To Do It): Perl supports many approaches to hashes, but references allow flexible data composition.
  • Useful for complex nested data structures (hash of hashes, arrays of hashes, etc.).
  • Pass data structures to subroutines efficiently without flattening arguments.

Common Pitfalls

  • Remember the difference between { } (anonymous hashref) and ( ) (list for named hash).
  • When printing or inspecting, remember that scalar refs don't stringify as you might expect; use functions like Data::Dumper for debugging.
  • Dereference carefully: using wrong sigils or forgetting arrow -> leads to syntax or runtime errors.

Example: Creating and Using an Anonymous Hash


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

# Create an anonymous hash (hash reference)
my $person = {
    name => 'Bob',
    age  => 42,
    hobbies => ['reading', 'coding', 'hiking']
};

# Accessing elements via arrow notation
print "Name: " . $person->{name} . "\n";
print "Age: " . $person->{age} . "\n";

# Access array inside the hashref
print "First hobby: " . $person->{hobbies}->[0] . "\n";

# Adding a new key-value pair
$person->{profession} = 'Engineer';

# Loop through keys and values by dereferencing
while (my ($key, $value) = each %$person) {
    # For arrays, print number of elements
    if (ref $value eq 'ARRAY') {
        print "$key has " . scalar(@$value) . " hobbies\n";
    } else {
        print "$key => $value\n";
    }
}

This script demonstrates:

  • Creating a hash reference with { }.
  • Accessing scalar and array values within the hashref using ->.
  • Adding new key-value pairs on the fly to the anonymous hash.
  • Iterating over a hash reference by dereferencing with %$person.

Note: This syntax has been stable and works the same in all modern Perl versions (5.6 and above). Perl's context sensitivity combined with sigils ($ for scalars, % for hashes, @ for arrays) helps differentiate references and data structures elegantly.

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