Анимация
JavaScript
|
Главная Библионтека Оператор 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 |