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.



Learning Perl Objects, References & Modules
Learning Perl Objects, References, and Modules
ISBN: 0596004788
EAN: 2147483647
Year: 2003
Pages: 199

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net