home | O'Reilly's CD bookshelfs | FreeBSD | Linux | Cisco | Cisco Exam

## 4.5. Iterating Over an Array by Reference

### 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";
}```