Sign In/My Account | View Cart  
advertisement


Listen Print
The Perl Cookbook (cover)

Perl Recipe of the Day:
Iterating Over an Array by Reference

The following recipe is from The Perl Cookbook, by Tom Christiansen and Nathan Torkington.

Buy it now, or read it online on Safari.


Problem

You have a reference to an array, and you want to use foreach to work with the array's elements.

Solution

Use foreach or for to loop over the dereferenced array:

# iterate over elements of array in $ARRAYREF
foreach $item (@$ARRAYREF) {
    # do something with $item
}

for ($i = 0; $i <= $#$ARRAYREF; $i++) {
    # do something with $ARRAYREF->[$i]
}

Discussion

The solutions assume you have a scalar variable containing the array reference. This lets you do things like this:

@fruits = ( "Apple", "Blackberry" );
$fruit_ref = \@fruits;
foreach $fruit (@$fruit_ref) {
    print "$fruit tastes good in a pie.\n";
}



 Apple tastes good in a pie.
 





 Blackberry tastes good in a pie.
 
 

We could have rewritten the foreach loop as a for loop like this:

for ($i=0; $i <= $#$fruit_ref; $i++) {
    print "$fruit_ref->[$i] tastes good in a pie.\n";
}

Frequently, though, the array reference is the result of a more complex expression. You need to use the @{ EXPR } notation to turn the result of the expression back into an array:

$namelist{felines} = \@rogue_cats;
foreach $cat ( @{ $namelist{felines} } ) {
    print "$cat purrs hypnotically..\n";
}
print "--More--\nYou are controlled.\n";

Again, we can replace the foreach with a for loop:

for ($i=0; $i <= $#{ $namelist{felines} }; $i++) {
    print "$namelist{felines}[$i] purrs hypnotically.\n";
}

See Also

perlref (1) and perllol (1); Chapter 4 of Programming Perl ; Recipe 11.1 ; Recipe 4.4