Оператор for — 6. «Устойчивость» переменной цикла

Уже известно, что переменная, объявленная в заголовке for(), локальна в пределах тела цикла: она скрывает любую ранее объявленную переменную с тем же именем и прекращает существование по завершении цикла.

Теперь попробуем изменить счетчик, но уже не за пределами цикла, а внутри него:

Эта программа выведет на экран следующие строки:

Числа в первом столбце — это значения счетчика сразу после начала очередной итерации, а во втором столбце напечатано значение переменной $counter после попытки ее изменения. Очевидно, что до тех пор, пока счетчик не вырос до пяти, величины в обеих столбцах будут совпадать.

После того, как $counter стал равен пяти, его значение изменилось (стало равным семи). Однако, уже на следующей итерации на печать вновь выводятся одинаковые числа, а тело цикла в общей сложности выполнилось десять раз, несмотря на попытку пропустить одну итерацию.

Трактовать полученный результат можно двояко (трактовка с точки зрения программиста не обязательно должна совпадать с истинной реализацией). Например, можно считать, что при попытке изменить счетчик создается локальная переменная с тем же именем, которая скрывает счетчик. Более логично, однако, считать, что независимо от манипуляций с переменной, набор значений, которые она принимает, определен еще до первой итерации. Действительно, при объявлении цикла явно указан некоторый список, элементы которого последовательно будут присвоены счетчику.

1 1
2 2
3 3
4 4
5 7
6 6
7 7
8 8
9 9
10 10
sub main(){
for 1..10 -> $counter{
print $counter, ‘ ‘;
$counter = 7 if $counter == 5;
print $counter, «\n»;
}
}