Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Изучаем Perl - Шварц Р.

Шварц Р., Кристиансен Т. Изучаем Perl — Москва, 2002. — 324 c.
Скачать (прямая ссылка): izuchaemperl2002.djvu
Предыдущая << 1 .. 50 51 52 53 54 55 < 56 > 57 58 59 60 61 62 .. 124 >> Следующая

разделе "Модификаторы выражений" мы покажем, как можно использовать
оператор if с меньшим числом знаков препинания.)
Мешки
Что делать, если вы хотите выйти из блока, в которым содержится самый
внутренний блок, иными словами, выйти сразу из двух вложенных блоков? В С
вы могли бы обратиться к оклеветанному всеми оператору goto. В Perl такая
хитрость не нужна - здесь по отношению к любому охватывающему блоку можно
использовать операторы last, next и redo, присвоив этому блоку имя с
помощью метки.
Метка - это еще один тип имени из еще одного пространства имен,
отвечающего тем же правилам, что и имена скаляров, массивов, хешей и
подпрограмм. Мы увидим, однако, что в метке нет специального префиксного
символа (аналогичного $ в скалярах, символу & в подпрограммах и т.д.),
поэтому метка print, к примеру, конфликтовала бы с зарезервированным
словом print, в силу чего ее использование не допускается. По этой
причине лучше создавать метки с именами, состоящими только из прописных
букв и цифр, которые в будущем никогда не будут использоваться в
зарезервированных словах. Кроме того, прописные буквы и цифры хорошо
выделяются в тексте программы, который набирается в основном с
использованием нижнего регистра.
Выбрав имя метки, введите его прямо перед оператором, содержащим блок, и
поставьте двоеточие:
МЕТКА: while (условие) {
оператор; оператор;
138
Изучаем Perl
оператор;
if (другое_условие) (
last МЕТКА;
}
)
Мы указали метку как параметр в операторе last. Это дает языку Perl
указание выйти из блока с именем метка, а не только из самого внутреннего
блока. В данном случае, однако, у нас есть только один циклический блок.
Давайте рассмотрим вариант со вложенными циклами:
OUTER: for ($1=1; $1 <= 10; $i++) {
INNER: for ($ц=1; <= 10; $]++) {
if ($i * $D == 63) {
print "$i times'?] is бЗ'Хп"; last OUTER;
)
if ($д >=$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 управляющее_выражение;
9. Управляющие структуры
139
В данном случае управляющее_выражение проверяется на истинность (по тем
же правилам, что и всегда). Если оно истинно, то вычисляется выражение.
Это приблизительно эквивалентно конструкции
if (управлякщее^выражеиие) {
выражение;
}
Однако в данном случае дополнительные знаки препинания не нужны, оператор
читается справа налево, а выражение должно быть простым (т.е. не может
быть блоком операторов). Во многих случаях, однако, такая инвертированная
запись оказывается наиболее естественным способом задания условия.
Например, вот как можно выйти из цикла при возникновении определенного
условия:
ЫНЕ: while (<STDIN>) {
last LINE if /AFrom: /;
}
Видите, насколько проще такая запись? Более того, вы даже можете
прочитать ее на нормальном языке: "последняя строка, если она начинается
со слова From".
Кроме описанной выше, существуют и другие формы с модификаторами:
выраж2 unless выраж!; # как unless {выраж1) { выраж2; }
выраж2 while выраж!; # как while (выраж1) { выраж2; }
выраж2 until выраж!; 4 как until (выраж!) { выраж2; }
Во всех этих формах сначала вычисляется выраж1, а затем в зависимости от
результата что-то делается или не делается с выраж2.
Например, вот как можно найти первую по порядку степень числа 2, которая
больше заданного числа:
chomp (5n = v'STDIN>) ;
$i=l; # исходное предположение
$1 *= 2 until $i > $п; # вычислять, пока не будет найдена
Как видите, мы опять добиваемся ясности и убираем лишнее.
Эти формы нельзя вкладывать одну в другую: нельзя сказать выражЗ while
выраж2 if выраж!. Это объясняется тем, что форма выраж2 if выраж! - уже
не выражение, а полноценный оператор; после оператора модификатор ставить
нельзя.
140
Научаем Perl
Операции && и || как управляющие структуры
Операции && и | | в тексте программы похожи на знаки препинания или
Предыдущая << 1 .. 50 51 52 53 54 55 < 56 > 57 58 59 60 61 62 .. 124 >> Следующая