References
๐ References
bless, Chapter 3) is built directly on top of.
โ What Is a Reference?
A reference is a scalar that points to another piece of data โ an array, a hash, another scalar, even a subroutine โ rather than holding that data directly. It's a similar idea to a pointer in C, but considerably safer: no pointer arithmetic, no manual memory management.
my @fruits = ("apple", "banana"); my $array_ref = \@fruits; # \ creates a reference TO @fruits my %ages = ("Ada" => 28); my $hash_ref = \%ages; # a reference to %ages
The backslash operator \ creates a reference โ $array_ref is a single scalar value that points to @fruits, it is not itself an array.
say $array_ref; # ARRAY(0x55d1f8a2c3e0) โ the reference's own string form, NOT the array's contents!
Printing a reference directly shows an internal identifier, not the data it points to โ a common early confusion. To see the actual contents, you have to dereference it first, covered next.
๐ Dereferencing
# the classic syntax โ wrap in the appropriate sigil and braces: say join(", ", @{$array_ref}); # apple, banana say ${$scalar_ref}; # the modern, idiomatic arrow syntax โ used constantly in real code: say $array_ref->[0]; # apple โ one element, via -> say $hash_ref->{"Ada"}; # 28
-> is by far the more common style in real Perl โ $array_ref->[0] reads naturally as "the reference, then index 0 of what it points to," and it's what you'll see in essentially every real codebase.
๐ถ๏ธ Anonymous Data Structures
my $fruits_ref = ["apple", "banana", "cherry"]; # [] creates an ANONYMOUS array ref directly my $person_ref = { name => "Ada", age => 28 }; # {} creates an ANONYMOUS hash ref directly
Square brackets and curly braces used this way build a reference to a brand-new array or hash with no named @array or %hash ever existing at all โ this is the standard way real code constructs nested structures, rather than declaring a separate named variable for every intermediate piece.
๐๏ธ Building Nested Data Structures
This is the actual payoff โ combining anonymous references to build shapes that map directly onto real-world data, JSON responses, or config files:
# an array of hashes: my @people = ( { name => "Ada", age => 28 }, { name => "Alan", age => 41 }, ); say $people[0]{name}; # Ada โ the arrow between [0] and {name} is optional here # a hash of arrays: my %teams = ( red => ["Ada", "Grace"], blue => ["Alan"], ); say $teams{red}[0]; # Ada
โก๏ธ Arrow Notation โ When You Can Drop the Arrow
Perl allows omitting -> between two consecutive subscripts โ $people[0]{name} and $people[0]->{name} are exactly identical. The very first arrow (immediately after the reference variable) is the one that genuinely matters when it's not already implied by context; every subsequent one in a chain is optional stylistic sugar. Many real codebases keep every arrow for consistency and readability regardless โ both styles are correct.
๐ง A Worked Example โ Extending Chapter 8's Log Processor
my @entries = ( { level => "ERROR", message => "Connection timeout" }, { level => "WARN", message => "Retrying request" }, { level => "ERROR", message => "Disk full" }, ); foreach my $entry (@entries) { say "[$entry->{level}] $entry->{message}"; }
Where Chapter 8's log processor tallied plain counts into a flat hash, this version keeps each log entry as its own structured hashref inside an array โ genuinely closer to how a real log parser or API response is shaped, and directly extensible (add a timestamp key, a nested {context => {...}} hashref, and so on) without restructuring anything already written.
References: Perl vs. Python
In Python, a variable holding a list or dict is already a reference under the hood โ b = a for two lists means both names point to the same underlying list, with no explicit "reference" syntax anywhere. Perl makes this distinction fully explicit and visible: a plain @array is real data with value-copy semantics on assignment, while \@array is deliberately, visibly a reference. More to type, but it means you can always tell from the code itself, without knowing a type's internal behavior, whether you're holding data or a pointer to it.
\ creates a reference
\@array, \%hash, \$scalar โ a scalar pointing to the original.
-> dereferences
$ref->[0], $ref->{key} โ the idiomatic modern syntax.
[ ] and { } build anonymous refs
No named variable required โ the standard way to build nested structures.
Chained arrows are optional
Only the first arrow ever matters; later ones in a chain are sugar.
๐ป Coding Challenges
Challenge 1: Build and Dereference
Create an array of 3 numbers, take a reference to it with \, then use the arrow syntax to print the second element and the total count (scalar(@$array_ref)).
Challenge 2: An Array of Hashes
Build an array of 3 anonymous hashrefs, each representing a product with name and price keys. Loop over the array and print each product formatted as "Widget: $19.99".
Challenge 3: A Hash of Arrays
Build a hash mapping 2 department names to an anonymous array of employee names in each. Print every employee in the "Engineering" department using arrow-based dereferencing.
๐ Course Complete!
That's all 9 chapters of Perl Fundamentals โ getting started, scalars, arrays, hashes, control flow, regular expressions, subroutines, file I/O, and references. Next up: Perl Intermediate/Advanced (perl2), starting with Advanced Regular Expressions.