Basics — taking references and using them#
There are only two ways to make a reference to something that
already has a name, and only two ways to use a reference once
you have it. This chapter covers both. Anonymous constructors
([...], {...}) are covered in Anonymous references.
Making a reference with backslash#
Put a backslash in front of any variable, and you get a scalar that refers to it:
my @array = (1, 2, 3);
my %hash = (APR => 4, AUG => 8);
my $n = 42;
my $aref = \@array; # reference to the array
my $href = \%hash; # reference to the hash
my $sref = \$n; # reference to the scalar
A reference is itself a scalar. You can copy it, pass it, store it in another data structure, without touching the thing it points at:
my $copy = $aref; # two scalars, one underlying array
my @slots;
$slots[3] = $href; # hash reference stored as an array element
my $pulled = $slots[3];
Both $aref and $copy point at the same array. Changing the
array through one is visible through the other. To actually copy
the contents, see Anonymous references.
What a reference prints as#
Stringify a reference and you get a type tag plus an address:
print "$aref\n"; # ARRAY(0x55d3c1a02b40)
print "$href\n"; # HASH(0x55d3c1a02be0)
If you ever see output like that by accident, you printed the reference where you meant to print the contents.
Using a reference — the curly-brace form#
Wherever you could have written a variable name, you can put the reference in curly braces instead. The rule is mechanical:
Operation on |
Same operation via |
|---|---|
|
|
|
|
|
|
|
|
|
|
Hashes follow the same pattern:
Operation on |
Same operation via |
|---|---|
|
|
|
|
|
|
|
|
And scalars:
my $x = 10;
my $ref = \$x;
print ${$ref}; # 10
${$ref} = 99;
print $x; # 99
The curly braces can usually be dropped when what’s inside is a
plain scalar variable: @$aref means the same as @{$aref}, and
$$sref means the same as ${$sref}. Start with the curly form
until the short form stops looking ambiguous; $$hash{key} and
${$hash}{key} both work, but $$table{$country}[0] is easier to
misread than ${$table}{$country}[0].
Using a reference — the arrow form#
The most common thing you do with a reference is fetch one element
out of the array or hash it points at. The curly form works
(${$aref}[3]) but is hard to read. The arrow form is the
abbreviation:
$aref->[3] # same as ${$aref}[3]
$href->{red} # same as ${$href}{red}
The arrow is not cosmetic. It is the thing that distinguishes two different meanings:
$aref->[3] # fourth element of the array $aref points at
$aref[3] # fourth element of the unrelated array @aref
$aref and @aref are separate variables, as unrelated as $x
and @x. Forgetting the arrow silently fetches from a different
array that probably does not exist. Running under use strict
turns the mistake into a compile-time error instead of a silent
wrong answer at runtime.
Asking what a reference points at#
The ref built-in returns a string
describing the referent’s kind:
ref $aref # ARRAY
ref $href # HASH
ref $sref # SCALAR
ref \&printer # CODE
ref $n # empty string — $n isn't a reference
Combine with boolean context to test “is this a reference?”:
if (ref $maybe) {
# it's a reference of some kind
}
if (ref $maybe eq 'ARRAY') {
# it's specifically an array reference
}
See ref for the full list of
return strings (including CODE, GLOB, REF, Regexp, and the
package name when the reference has been blessed into a class).
Two common beginner mistakes#
Treating a reference like the underlying container.
push $aref, 1does not push into the array; it’s a type error. You must dereference:push @{$aref}, 1or (equivalently)push @$aref, 1.Dropping the arrow between a variable and its subscript.
$aref[3]is not the same as$aref->[3]. The first reads from@aref, the second reads through the reference.
Where to go next#
Arrays of arrays — the two-dimensional case, and the arrow-between-subscripts rule.
Anonymous references —
[...]and{...}for building structures without named intermediates.