Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 [ 43 ] 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

Оператор next

Как и last, оператор next изменяет последовательность выполнения программы. Отличие между ними состоит в том, что next заставляет программу пропускать оставшуюся часть самого внутреннего блока цикла, не завершая этот цикл*. Используется оператор next следующим образом:

while {что-то) ( первая часть; первая часть; первая часть; if {усдовие) [

какая-то часть;

какая-то часть;

next ;

другаячасть; другая часть;

# next передает управление в эту точку программы

Если условие истинно, то выполняется какая-то часть, а другая часть пропускается.

Как и при использовании оператора last, блок оператора if не считается блоком, образующим цикл.

Оператор redo

Третий способ передачи управления в блоке цикла - оператор redo. Эта конструкция обеспечивает переход в начало текущего блока (без повторного вычисления контрольного выражения):

while (условие) {

# redo передает управление в эту точку программы

что-то;

что-то;

что-то;

if (условие) {

какие-то действия; какие-то действия; redo;

еще что-то; еше что-то; eiixe 4To-To;

Если в данном цикле есть оператор continue, который мы не рассматривали, next переходит в начало блока continue, а не в конец блока цикла. Это практически одно и то же.



Блок i f здесь тоже не учитывается; считаются только циклообразующие блоки.

Пользуясь оператором redo, оператором last и "голым" блоком, можно построить бесконечный цикл, образующийся внутри блока:

начальные деиствия; начальные действия; на чальные дейс твия; if {условие) I last;

последующие действия; последующие действия; послвдующие действия; redo;

Такая схема годится для while-подобного цикла, некоторая часть которого должна выполняться как инициализационная перед первой проверкой. (В разделе "Модификаторы выражений" мы покажем, как можно использовать оператор if с меньшим числом знаков препинания.)

Метки

Что делать, если вы хотите выйти из блока, в которым содержится самый внутренний блок, иными словами, выйти сразу из двух вложенных блоков? В С вы могли бы обратиться к оклеветанному всеми оператору goto. В Perl такая хитрость не нужна - здесь по отношению к любому охватывающему блоку можно использовать операторы last, next и redo, присвоив этому блоку имя с помощью метки.

Метка - это еще один тип имени из еще одного пространства имен, отвечающего тем же правилам, что и имена скаляров, массивов, хешей и подпрограмм. Мы увидим, однако, что в метке нет специального префиксного символа (аналогичного $ в скалярах, символу & в подпрограммах и т.д.), поэтому метка print, к примеру, конфликтовала бы с зарезервированным словом print, в силу чего ее использование не допускается. По этой причине лучше создавать метки с именами, состоящими только из прописных букв и цифр, которые в будущем никогда не будут использоваться в зарезервированных словах. Кроме того, прописные буквы и цифры хорошо выделяются в тексте программы, который набирается в основном с использованием нижнего регистра.

Выбрав имя метки, введите его прямо перед оператором, содержащим блок, и поставьте двоеточие:

МЕТКА: while [условие] { оператор; оператор;



оператор;

if (другоеусловие) last МЕТКА;

Мы указали метку как параметр в операторе last. Это дает языку Perl указание выйти из блока с именем метка, а не только из самого внутреннего блока. В данном случае, однако, у нас есть только один циклический блок. Давайте рассмотрим вариант со вложенными циклами:

OUTER: for ($1=1; $i <= 10; $i++) {

INNER: for ($3=1; $] <= 10; $]++) { if ($1 * $3 == 63) {

print "$i times$] IS 63\n";

last OUTER;

If ($D>=$i) { next OUTER;

Этот набор операторов позволяет перебирать все результаты перемножения небольших чисел до тех пор, пока не будет найдена пара, произведение которой равно 63 (7 и 9). После того как эта пара будет найдена, проверка остальных чисел теряет смысл, поэтому первый оператор if обеспечивает выход из обоих циклов for, используя для этого оператор last с меткой. Второй оператор if гарантирует, что большим из двух чисел всегда будет первое, переходя к следуюшей итерации внешнего цикла, как только поставленное условие перестанет быть истинным. Это значит, что числа будут проверяться при значениях переменных ($i,$j) = (1,1), (2,1), (2,2), (3,1), (3,2), (3,3), (4,1) ит.д.

Даже если самый внутренний блок имеет метку, действие операторов last, next и redo без необязательного параметра (метки) все равно распространяется на него. Кроме того, с помощью меток нельзя переходить в блок - можно только выходить из него. Операторы last, next или redo должны находиться внутри блока.

Модификаторы выражений

В качестве еще одного способа сказать "если это, тогда то" Perl позволяет "прикреплять" к выражению, представляющему собой отдельный оператор, модификатор if.

выражение if управляющее выражение;



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 [ 43 ] 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103