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.
For example:
$i = 3; while ( $i ) { print "$i "; $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 "; }
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 "; }
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:
@array = ('one', 'two', 'three'), foreach $element (@array) { $element = 'four'; } foreach $element (@array) { print $element," "; }
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," "; $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," "; $i--; } while ( $i );
3 2 1