-
=head1 NAME
perlreftut - Mark's very short tutorial about references
One of the most important new features in Perl 5 was the capability to
manage complicated data structures like multidimensional arrays and
nested hashes. To enable these, Perl 5 introduced a feature called
-`references', and using references is the key to managing complicated,
+'references', and using references is the key to managing complicated,
structured data in Perl. Unfortunately, there's a lot of funny syntax
to learn, and the main manual page can be hard to follow. The manual
is quite complete, and sometimes people find that a problem, because
=head1 Who Needs Complicated Data Structures?
-One problem that came up all the time in Perl 4 was how to represent a
-hash whose values were lists. Perl 4 had hashes, of course, but the
-values had to be scalars; they couldn't be lists.
+One problem that comes up all the time is needing a hash whose values are
+lists. Perl has hashes, of course, but the values have to be scalars;
+they can't be lists.
Why would you want a hash of lists? Let's take a simple example: You
have a file of city and country names, like this:
the input, iterate over the hash as usual, sorting each list of cities
before you print it out.
-If hash values can't be lists, you lose. In Perl 4, hash values can't
-be lists; they can only be strings. You lose. You'd probably have to
+If hash values couldn't be lists, you lose. You'd probably have to
combine all the cities into a single string somehow, and then when
time came to write the output, you'd have to break the string into a
list, sort the list, and turn it back into a string. This is messy
reference that you're already familiar with. Think of the President
of the United States: a messy, inconvenient bag of blood and bones.
But to talk about him, or to represent him in a computer program, all
-you need is the easy, convenient scalar string "George Bush".
+you need is the easy, convenient scalar string "Barack Obama".
References in Perl are like names for arrays and hashes. They're
Perl's private, internal names, so you can be sure they're
-unambiguous. Unlike "George Bush", a reference only refers to one
+unambiguous. Unlike "Barack Obama", a reference only refers to one
thing, and you always know what it refers to. If you have a reference
to an array, you can recover the entire array from it. If you have a
reference to a hash, you can recover the entire hash. But the
$aref = \@array; # $aref now holds a reference to @array
$href = \%hash; # $href now holds a reference to %hash
+ $sref = \$scalar; # $sref now holds a reference to $scalar
Once the reference is stored in a variable like $aref or $href, you
can copy it or store it just the same as any other scalar value:
that array. C<{ ITEMS }> makes a new, anonymous hash, and returns a
reference to that hash.
- $aref = [ 1, "foo", undef, 13 ];
+ $aref = [ 1, "foo", undef, 13 ];
# $aref now holds a reference to an array
- $href = { APR => 4, AUG => 8 };
+ $href = { APR => 4, AUG => 8 };
# $href now holds a reference to a hash
=head3 B<Use Rule 2>
-B<Use Rule 1> is all you really need, because it tells you how to to
+B<Use Rule 1> is all you really need, because it tells you how to do
absolutely everything you ever need to do with references. But the
most common thing to do with an array or a hash is to extract a single
element, and the B<Use Rule 1> notation is cumbersome. So there is an
or set the element in any row and any column of the array.
The notation still looks a little cumbersome, so there's one more
-abbreviation:
+abbreviation:
=head2 Arrow Rule
%table
- +-------+---+
+ +-------+---+
| | | +-----------+--------+
|Germany| *---->| Frankfurt | Berlin |
| | | +-----------+--------+
referred-to array.
There's one fine point I skipped. Line 5 is unnecessary, and we can
-get rid of it.
+get rid of it.
2 while (<>) {
3 chomp;
to push C<Athens> onto an array that doesn't exist, so it helpfully
makes a new, empty, anonymous array for you, installs it into
C<%table>, and then pushes C<Athens> onto it. This is called
-`autovivification'--bringing things to life automatically. Perl saw
+'autovivification'--bringing things to life automatically. Perl saw
that they key wasn't in the hash, so it created a new hash entry
automatically. Perl saw that you wanted to use the hash value as an
array, so it created a new empty array and installed a reference to it
This doesn't copy the underlying array:
- $aref2 = $aref1;
+ $aref2 = $aref1;
-You get two references to the same array. If you modify
+You get two references to the same array. If you modify
C<< $aref1->[23] >> and then look at
-C<< $aref2->[23] >> you'll see the change.
+C<< $aref2->[23] >> you'll see the change.
To copy the array, use
$href2 = {%{$href1}};
-=item *
+=item *
To see if a variable contains a reference, use the C<ref> function. It
returns true if its argument is a reference. Actually it's a little
better than that: It returns C<HASH> for hash references and C<ARRAY>
for array references.
-=item *
+=item *
If you try to use a reference like a string, you get strings like
Author: Mark Jason Dominus, Plover Systems (C<mjd-perl-ref+@plover.com>)
This article originally appeared in I<The Perl Journal>
-( http://www.tpj.com/ ) volume 3, #2. Reprinted with permission.
+( http://www.tpj.com/ ) volume 3, #2. Reprinted with permission.
The original title was I<Understand References Today>.