Введение в Perl - Маслов Владимир Викторович. Страница 3

Любое простое предложение может содержать single модификатор перед ';'. Существуют следующие single модификаторы:

if EXPR

unless EXPR

while EXPR

until EXPR

где EXPR – выражение возвращающее логическое значение true или false.

Модификаторы while и until вычисляются в начале предложения кроме блока do который выполняется первым.

if EXPR– Модификатор «если». Предложение выполняется если EXPR возвращает true.

Пример:

$var = 1;

$var2 = 3 if $var > 0; # Результат: $var2 = 3

while EXPR – Модификатор «пока». Предложение выполняется столько раз покаEXPR = true

Пример:

$var = 1;

print $var++ while $var < 5; # Печать $var с инкрементом

Результат: 1234

until EXPR – Модификатор "до ". Предложение выполняется до тех пор пока EXPR = false

Пример:

$var = 1;

print $var++ until $var > 5; # Печать $var с инкрементом

Результат: 12345

unless EXPR – Модификатор «если не» . Обратный к if. Выражение выполняется есле EXPR = false.

Пример:

$var = 1;

print $var++ unless $var > 5; # Печать $var с инкрементом

Результат: 1

Сложные предложения.

Последовательность простых предложений ограниченная функциональными ограничителями называется блоком. В Перл это может быть целый файл, последовательность предложений в операторе eval{} или чаще всего это множество простых предложений ограниченных круглыми скобками '{}'.

Сужествуют следующие виды сложных предложений:

if (EXPR) BLOCK

if (EXPR) BLOCK else BLOCK

if (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK

LABEL while (EXPR) BLOCK

LABEL while (EXPR) BLOCK continue BLOCK

LABEL for (EXPR; EXPR; EXPR) BLOCK

LABEL foreach VAR (LIST) BLOCK

LABEL BLOCK continue BLOCK

Обратите внимание, что сложные предложения описаны в термах блоков а не предложений как в языках C или Pascal. Поэтому необходимо всегда использовать круглые скобки для обозначения блока.

if (EXPR) BLOCK – Вычисляется логическое выражение EXPR и если true блок выполняется.

Пример:

$var =1;

if ($var == 1)

{ print $var,"\n";

}

Результат: 1

if (EXPR) BLOCKelseBLOCK2 – Если EXPR=true выполняется BLOCK иначе BLOCK2.

Пример:

$var =2;

if ($var == 1)

{ print «\$var = 1\n»;

}

else

{ print «\$var не равно 1\n»;

}

Результат: $var не равно 1

if (EXPR1) BLOCK1 elsif (EXPR2) BLOCK2 ... else BLOCK – Если EXPR1=true выполняется BLOCK1 иначе если EXPR2=true выполняется BLOCK2 иначе ... иначе BLOCK.

Пример:

$var = 1;

if ($var == 0)

{ print «\$var = 0\n»;

}

elsif ($var == 1)

{ print «\$var = 1\n»;

}

else

{ print «Не известное \$var\n»;

}

Результат: $var = 1

Цикл while выполняет BLOCK до тех пор пока EXPR = true. Метка LABEL не обязательна и состоит из идентификатора завершающегося символом ':'. Метка необходима при использовании внутри блока цикла управляющих операторов next, last и redo. Если метка все же отсутсвует то эти операторы ссылаются к началу ближайшего цикла.

Блок после continue выполняется всегда перед тем как вычисляется логическое выражение EXPR. Это подобно EXPR3 в предлжении for поэтому в этом блоке удобно изменять счетчики и флаги цикла даже если применяестя оператор next.

Операторы управления циклом.

next – подобен continue в С. Переходит к началу текущего цикла т.е. повторяет итерацию.

Пример:

M1:

while ($i < 6)

{

++$i; # Увеличиваем счетчик на 1

next M1 if $i < 3; # Переходим в начало если $i < 3

++$i; # иначе увеличиваем счетчик еще раз на 1

}

continue

{

print "$i "; # Печатаем $i

}

Результат: 1 2 4 6

last – подобен оператору break в языке С. Немедленно прерывает цикл. Блок continue пропускается.

Пример:

M1:

while ($i < 6)

{

++$i; # Увеличиваем счетчик на 1

last M1 if $i > 3; # Выход из цикла если $i > 3

++$i; # иначе увеличиваем счетчик еще раз на 1

}

continue {

print "$i "; # Печатаем $i

}

Результат: 2 4

redo – начать новый цикл не вычисляя EXPR и не выполняя continue блок.

Пример:

M1:

while ($i < 6)

{

++$i; # Увеличиваем счетчик на 1

redo M1 if $i == 3; # Далее пропустить для $i = 3

++$i; # иначе увеличиваем счетчик еще раз на 1

}

continue {

print "$i "; # Печатаем $i

}

Результат: 2 5 7

Цикл for.

LABEL for (EXPR1; EXPR2; EXPR3) BLOCK

Оператор for полностью аналогичен оператору for в С. В перед началом цикла выполняется EXPR1, если EXPR2 = true выполняется блок, затем выполняется EXPR3.

Пример:

for ($i = 2; $i < 5; ++$i)

{

print $i, " ";

}

print «\nПосле цикла i = $i\n»;

Результат:

2 3 4

После цикла i = 5

Цикл foreach.

LABEL foreach VAR (LIST) BLOCK

Переменной VAR присваивается поочередно каждый элемент списка LIST и выполняется блок. Если VAR опущенно то элементы присваиваются встроеной переменной $_. Если в теле блока изменять значение VAR то это вызовет изменение и элементов списка т.к. VAR фактически указывает на текущий элемент списка.

Вместо слова foreach можно писать просто for – это слова синонимы.

Пример:

@месяц = («январь»,"февраль","март"); # Создали массив

foreach $i (@месяц)

{

print $i," "; # Печать $i

}

Результат: январь февраль март

Пример:

@месяц = («январь»,"февраль","март"); # Создали массив

foreach $i (@месяц)

{

$i = uc($i); # Перевели в верхний регистр

}

print @месяц;

Результат: ЯНВАРЬФЕВРАЛЬМАРТ

Пример:

for $i (3,5,7)

{

print "$i ";

}

Результат: 3 5 7

Блоки и оператор switch.

Блок не зависимо от того имеет он метку или нет семантически представляет собой цикл который выполняется один раз. Поэтому действие опраторов цикла next, last, redo – аналогично описанному выше. Блоки удобны для построения switch (переключатель) структур.