3.2 Taking a Reference to an Array
Among
its many other meanings, the backslash (\)
character is also the "take a reference
to" operator. When you use it in front of an array
name, e.g., \@skipper, the result is a
reference to that array. A reference to the
array is like a pointer: it points at the array, but is not the array
itself.
A reference fits wherever a scalar fits.
It can go into an element of an array or a hash, or into a plain
scalar variable, like this:
my $reference_to_skipper = \@skipper;
The reference can be copied:
my $second_reference_to_skipper = $reference_to_skipper;
or even:
my $third_reference_skipper = \@skipper;
All three references are completely interchangeable. You can even say
they're identical:
if ($reference_to_skipper = = $second_reference_to_skipper) {
print "They are identical references.\n";
}
This equality compares the numeric forms of
the two references. The numeric form of the reference is the unique
memory address of the @skipper internal data
structure, unchanging during the life of the variable. If you look at
the string form instead, with eq or
print, you get a debugging string:
ARRAY(0x1a2b3c)
which
again is unique for this array because it includes the hexadecimal
(base 16) representation of the array's unique
memory address. The debugging string also notes that this is an array
reference. Of course, if you ever see something like this in your
output, it almost certainly means there's a bug;
users of your program have little interest in hex dumps of storage
addresses!
Because a reference can be copied, and passing an argument to a
subroutine is really just copying, you can use this code to pass a
reference to the array into the subroutine:
my @skipper = qw(blue_shirt hat jacket preserver sunscreen);
check_required_items("The Skipper", \@skipper);
sub check_required_items {
my $who = shift;
my $items = shift;
my @required = qw(preserver sunscreen water_bottle jacket);
...
}
Now
$items in the subroutine will be a reference to
the array of @skipper. But how do you get from a
reference back into the original array? By
dereferencing the reference.
|