Оператор next

Иногда текущая итерация завершена, но прекращать выполнение всего цикла пока рано. Для таких случаев существует оператор next, осуществляющий переход к нижнему концу текущего блока цикла. После next выполнение продолжается со следующей итерацией цикла (по аналогии с оператором continue в C или другом похожем языке):

# Анализ слов во входном файле или файлах
while (<>) {
foreach (split) { # Разбить $_ на слова, последовательно присвоить
# каждое слово $_
$total++;
next if /\W/; # Для непонятных слов остаток итерации пропускается
$valid++;
$count{$_}++; # Увеличить счетчик для каждого слова
## Сюда next передает управление ##
}
}
print "total things = $total, valid words = $valid\n";
foreach $word (sort keys %count) {
print "$word was seen $count{$word} times.\n";
}

Этот пример немного сложнее большинства примеров, встречавшихся ранее; давайте разберем его шаг за шагом. Цикл while последовательно читает входные строки из оператора <> в $_; мы уже видели это раньше. При каждой итерации в $_ оказывается очередная строка ввода. Внутри цикла вложенный цикл foreach перебирает возвращаемое значение split.


Помните используемую по умолчанию версию split без аргументов? Она разбивает $_ по пропускам, то есть $_ фактически разбивается на список слов. Так как в цикле foreach управляющая переменная не указана, будет использоваться $_. Итак, в $_ последовательно заносится одно слово за другим. Но разве мы не говорили, что в $_ последовательно заносятся строки входных данных? Да, во внешнем цикле это именно так.

Но во вложенном цикле foreach в $_ последовательно заносятся слова. Повторное использование $_ для других целей не создает никаких проблем; такое происходит постоянно. Итак, в цикле foreach в переменную $_ последовательно заносятся слова текущей строки входных данных. Переменная $total увеличивается; в ней должно храниться общее количество слов. Но следующая строка (главная в этом примере) проверяет, содержит ли слово «посторонние» символы – любые, кроме букв, цифр и символов подчеркивания. Таким образом, для слов вида Tom's или full-sized, а также слов с прилегающими запятыми, вопросительными знаками или другими нестандартными символами шаблон совпадает, оставшаяся часть итерации пропускается, а программа переходит к следующему слову.

Но, допустим, в переменную попало обычное слово, например fred.


В этом случае $valid увеличивается на 1; то же происходит с $count{$_}, счетчиком вхождений слова. Таким образом, после завершения двух циклов будет подсчитано каждое слово в каждой строке входных данных из каждого файла, указанного пользователем. Мы не будем объяснять последние несколько строк. Надеемся, к этому моменту вы уже разобрались, как это происходит. Как и last, оператор next может использоваться в любых из пяти видов
блоков циклов: for, foreach, while, until и простейшем блоке. Во вложенных блоках циклов next завершает итерацию внутреннего блока. О том, как изменить это поведение, вы узнаете в конце раздела.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Автоинкремент и автодекремент
Значение автоинкремента
Значение ускоренного логического оператора
Логические операторы
Метки блоков