100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
Programming

References in Perl

Understand Perl references — pointers to scalars, arrays, hashes, and subs — and how to build complex, nested data structures.

Control Flow & SubroutinesAdvanced11 min readJul 10, 2026
Analogies

What Are References?

A reference is a scalar value that points to another piece of data — a scalar, array, hash, sub, or even another reference — rather than containing that data itself. References are created with the backslash operator (\@array, \%hash) or with anonymous constructors ([ ] for arrays, { } for hashes). Because a Perl array or hash cannot directly contain another array or hash, references are what make nested data structures possible.

🏏

Cricket analogy: A scorecard doesn't contain the actual players, it holds names that point to real people on the field, just as a Perl reference doesn't contain the data itself but a scalar value that points to where a scalar, array, or hash actually lives in memory.

Creating References: \ vs Anonymous Constructors

The backslash operator (\@array, \%hash, \$scalar) creates a reference to an already-existing named variable. Anonymous constructors build entirely new, unnamed data and return a reference to it directly: [1, 2, 3] creates a new anonymous array reference, and { name => 'Meera' } creates a new anonymous hash reference, both without ever declaring an intermediate named variable — ideal for building nested structures inline.

🏏

Cricket analogy: Getting a reference to an already-selected national squad (\@national_squad) is different from drafting a brand-new scratch XI on the spot for a charity match ([qw/PlayerA PlayerB/]), mirroring how Perl's \@array references an existing named array while [1,2,3] builds a fresh anonymous array reference on the fly.

perl
# Building an array of hashes using anonymous constructors
my @employees = (
    { name => 'Meera',  dept => 'Engineering' },
    { name => 'Sanjay', dept => 'Sales' },
);

for my $emp (@employees) {
    print "$emp->{name} works in $emp->{dept}\n";
}

# Reference to a named array, and a code reference
my @scores = (90, 85, 77);
my $scores_ref = \@scores;
print "First score: $scores_ref->[0]\n";
print "All scores: @{$scores_ref}\n";       # explicit deref
print "Postfix deref: $scores_ref->@*\n";   # Perl 5.24+

my $double = sub { return $_[0] * 2 };
print "Doubled: ", $double->(45), "\n";

Dereferencing: Arrow Syntax and Postfix Deref

The arrow operator (->) dereferences one level of a reference to access an element or method: $ref->[0] for an array reference, $ref->{key} for a hash reference. Arrows are optional between two consecutive subscripts, so $aoh[0]{name} and $aoh[0]->{name} are equivalent. Since Perl 5.24, postfix dereference syntax ($ref->@* for a full array, $ref->%* for a full hash) offers a left-to-right, more readable alternative to the older sigil-and-brace deref forms like @{$ref} once structures get deeply nested.

🏏

Cricket analogy: Navigating 'the wicketkeeper's team's captain' requires stepping through each link explicitly the first time, but once you're following a known chain of possessions you can drop the repeated connectors, just as Perl lets you omit arrows between consecutive subscripts, so $aoh[0]{name} works the same as $aoh[0]->{name}.

Since Perl 5.24, postfix dereference syntax ($ref->@* for a full array deref, $ref->%* for a full hash deref, $ref->$* for a scalar deref) reads left-to-right and scales far better than nested @{ ... } / %{ ... } sigil-and-brace deref syntax once you have more than one or two levels of nesting.

Code References, Closures, and Circular References

\&subname creates a reference to a named subroutine, and sub { ... } written without a name creates an anonymous subroutine and returns a reference to it directly; both are called via $ref->(@args). Anonymous subs also form closures, capturing the lexical variables visible where they were defined. Because Perl frees memory through reference counting, two structures that permanently reference each other (a circular reference) never reach a count of zero and will leak memory in a long-running process unless one side is explicitly weakened with Scalar::Util::weaken().

🏏

Cricket analogy: A fielding drill choreographed once and handed to any coach to run later is like a Perl code reference my $drill = sub { ... };, callable via $drill->(), while two coaches who permanently reference each other's schedules, neither letting go, mirror a circular reference needing weaken().

Perl uses reference counting to free memory, so two data structures that permanently reference each other (e.g., a parent node and child node both storing pointers back to each other) will never have their reference count drop to zero, causing a memory leak in long-running processes. Break the cycle with Scalar::Util::weaken() on one side of the pair, typically the 'back' pointer.

  • A reference is a scalar value that points to another piece of data — a scalar, array, hash, or subroutine — rather than containing it directly.
  • \@array and \%hash create references to existing named variables; [ ] and { } create anonymous array/hash references on the fly.
  • The arrow operator (->) dereferences one level; arrows are optional between consecutive subscripts in a chain.
  • Modern Perl (5.24+) supports postfix dereference syntax ($ref->@*, $ref->%*) as a readable alternative to sigil-and-brace deref.
  • \&subname or an anonymous sub { ... } creates a code reference, callable via ->().
  • References enable nested data structures (arrays of hashes, hashes of arrays, etc.) since Perl containers can't directly nest without them.
  • Circular references prevent Perl's reference-counting garbage collector from freeing memory; break cycles with Scalar::Util::weaken().

Practice what you learned

Was this page helpful?

Topics covered

#Programming#PerlStudyNotes#ReferencesInPerl#References#Perl#Creating#Anonymous#StudyNotes#SkillVeris#ExamPrep