A.14 Loops

Loops repeatedly execute the statements in a block until a conditional test changes value. There are several forms of loops in Perl:

while(CONDITION) {BLOCK}
until(CONDITION) {BLOCK}
for(INITIALIZATION ; CONDITION ; RE-INITIALIZATION ) {BLOCK}
foreach VAR (LIST) {BLOCK}
for VAR (LIST) {BLOCK}
do {BLOCK} while (CONDITION)
do {BLOCK} until (CONDITION)

The while loop first tests if the conditional is true; if so, it executes the block and then returns to the conditional to repeat the process. If false, it does nothing, and the loop is over:

$i = 3;
while ( $i ) {
    print "$i\n";
    $i--;
}

This produces the output:

3
2
1

Here's how the loop works. The scalar variable $i is first initialized to 3 (this isn't part of the loop). The loop is then entered, and $i is tested to see if it has a true (nonzero) value. It does, so the number 3 is printed, and the decrement operator is applied to $i, which reduces its value to 2. The block is now over, and the loop starts again with the conditional test. It succeeds with the true value 2, which is printed and decremented. The loop restarts with a test of $i, which is now the true value 1; 1 is printed and decremented to 0. The loop starts again; 0 is tested to see if it's true, and it's not, so the loop is now finished.

Loops often follow the same pattern, in which a variable is set, and a loop is called, which tests the variable's value and then executes a block, which includes changing the value of the variable.

The for loop makes this easy by including the variable initialization and the variable change in the loop statement. The following is exactly equivalent to the preceding example and produces the same output:

for ( $i = 3 ; $i ; $i-- ) {
    print "$i\n";
}

The foreach loop is a convenient way to iterate through the elements in an array. Here's an example:

@array = ('one', 'two', 'three');

foreach $element (@array) {
    print $element\n";
}

This prints the output:

one
two
three

The foreach loop specifies a scalar variable $element to be set to each element of the array. (You may use any variable name or none, in which case the special variable $_ is used automatically.) The array to be iterated over is then placed in parentheses, followed by the block. You can use for instead of foreach as the name of this loop, with identical behavior.

The first time through the loop, the value of the first element of the array is assigned to the foreach variable $element. On each succeeding pass through the loop, the value of the next element of the array is assigned to the foreach variable $element. The loop exits after it has reached the end of the array.

There is one important point to make, however. If, in the block, you change the value of the loop variable $element, the array is changed, and the change stays in effect after you've left the foreach loop. For example the following:

@array = ('one', 'two', 'three');

foreach $element (@array) {
    $element = 'four';
}

foreach $element (@array) {
    print $element,"\n";
}

produces the output:

four
four
four

In the do-until loop, the block is executed before the conditional test, and the test succeeds until the condition is true:

$i = 3;
do {
    print $i,"\n";
    $i--;
} until ( $i );

This prints:

3

In the do-while loop, the block is executed before the conditional test, and the test succeeds while the condition is true:

$i = 3;
do {
    print $i,"\n";
    $i--;
} while ( $i );

This prints:

3
2
1