На этом шаге мы рассмотрим использование команды next.
Ее общий вид:
next ИДЕНТИФИКАТОР_МЕТКИ;
Команда next позволяет пропустить расположенные после нее в теле цикла операторы и перейти на следующую итерацию цикла. Если оператор цикла содержит блок continue, то его операторы выполняются до проверки условия окончания цикла, с которой начинается следующая итерация. Одно из применений этой команды — обработать определенные элементы массива, ничего не делая с другими. Программа следующего примера присваивает всем элементам массива, содержащим четные числа, символ звездочка "*".
@array = (2, 5, 8, 4, 7, 9); print “До: @array\n”; # Вывод элементов массива foreach (@array) { # Цикл по элементам массива next if $_ % 2; # Переход, если число нечётное $_ = “*”; } print “После: @array\n”; # Вывод полученного массива
Результат выполнения программы:
До: 2 5 8 4 7 9 После: * 5 * * 7 9
Если элемент массива нечетное число, то результат операции $_ % 2 равен 1 (Истина) и команда next инициирует следующую итерацию цикла foreach, не изменяя значение текущего элемента массива. Если значением элемента массива является четное число, то команда next не выполняется и значение элемента меняется на символ "*".
Команда next, употребленная совместно с идентификатором метки, прерывает выполнение цикла, в теле которого она находится, и начинает новую итерацию цикла с указанной меткой, выполнив предварительно его блок continue, если таковой имеется:
$out = 0;
OUT: while ($out < 2) {
print "Начало внешнего цикла\п";
for($in=0; $in<=2;$in++) {
print "\$out: $out\t\$in: $in\n";
next OUT if $in == 1;
}
print "\$out: $out\n"; # Никогда не выполняется!
} continue {
print "Блок continue внешнего цикла\n";
$out++;
}
Вывод этой программы будет следующим:
Начало внешнего цикла $out: 0 $in: 0 $out: 0 $in: 1 Блок continue внешнего цикла Начало внешнего цикла $out: 1 $in: 0 $out: 1 $in: 1 Блок continue внешнего цикла
Обратите внимание, что количество итераций внутреннего цикла for равно двум, так как на второй его итерации выполняется команда next OUT, прекращающая его выполнение и инициализирующая выполнение очередной итерации внешнего цикла OUT. Оператор печати этого цикла пропускается, выполняется блок операторов continue, проверяется условие и если оно истинно, то тело цикла выполняется. Таким образом, оператор печати внешнего цикла OUT не выполняется ни одного раза, что подтверждается приведенным выше выводом.
На следующем шаге мы рассмотрим команду redo.