11.1. Taking References to ArraysProblemYou need to manipulate an array by reference. SolutionTo get a reference to an array: $aref = \@array; $anon_array = [1, 3, 5, 7, 9]; $anon_copy = [ @array ]; @$implicit_creation = (2, 4, 6, 8, 10);
To deference an array reference, precede it with an at sign ( push(@$anon_array, 11); Or use a pointer arrow plus a bracketed subscript for a particular element: $two = $implicit_creation->[0]; To get the last index number by reference, or the number of items in that referenced array: $last_idx = $#$aref; $num_items = @$aref; Or defensively embracing and forcing context: $last_idx = $#{ $aref }; $num_items = scalar @{ $aref }; DiscussionHere are array references in action: # check whether $someref contains a simple array reference if (ref($someref) ne 'ARRAY') { die "Expected an array reference, not $someref\n"; } print "@{$array_ref}\n"; # print original data @order = sort @{ $array_ref }; # sort it push @{ $array_ref }, $item; # append new element to orig array
If you can't decide whether to use a reference to a named array or to create a new one, here's a simplistic guideline that will prove right more often than not. Only take a reference to an existing array either to return the reference out of scope, thereby creating an anonymous array, or to pass the array by reference to a function. For virtually all other cases, use Automatic reference counting and the backslash operator make a powerful combination: sub array_ref { my @array; return \@array; } $aref1 = array_ref(); $aref2 = array_ref();
Each time
To access a particular element of the array referenced by print $array_ref->[$N]; # access item in position N (best) print $$array_ref[$N]; # same, but confusing print ${$array_ref}[$N]; # same, but still confusing, and ugly to boot If you have an array reference, you can only access a slice of the referenced array in this way: @$pie[3..5]; # array slice, but a little confusing to read @{$pie}[3..5]; # array slice, easier (?) to read Array slices, even when accessed through array references, are assignable. In the next line, the array dereference happens first, and then the slice: @{$pie}[3..5] = ("blackberry", "blueberry", "pumpkin"); An array slice is exactly the same as a list of individual array elements. Because you can't take a reference to a list, you can't take a reference to an array slice: $sliceref = \@{$pie}[3..5]; # WRONG!
To iterate through the entire array, use either a foreach $item ( @{$array_ref} ) { # $item has data } for ($idx = 0; $idx <= $#{ $array_ref }; $idx++) { # $array_ref->[$idx] has data } See AlsoChapter 4 of Programming Perl ; perlref (1) and perllol (1); Recipe 2.14 ; Recipe 4.5 |
|