Минимальная синтаксическая единица
$count = 0; # присваивание значения переменной $count++; # изменение значения операнда $result = 'Итого=' . $count . "\n"; # подготовка к печати 1; # литерал - минимальное, но корректное предложение
Последнее предложение, кажущееся бессмысленным, применяется в последней строке модулей для возврата "истинного" значения при успешной загрузке модуля. О модулях будет подробно рассказано в лекции 13.
Программа на
$count=0;$count++;$result='Итого='.$count."\n";1;
Но это считается дурным тоном. Да и разобраться в подобной программе будет очень сложно даже ее
Простые предложения, составленные из выражений, выполняются одно за другим, образуя простую последовательность действий. Последовательность может помещаться в блок - одно или несколько предложений, обрамленных
{ # начало блока
# последовательность предложений,
# образующих тело блока
} # конец блока
Кроме последовательности, в
Как известно, условные предложения определяют выполнение тех или иных действий в программе в зависимости от проверки заданного условия. В if ), проверяющая истинность одного условия, в самом простом виде записывается так:
if (условие) { # проверка истинности условия
# действия, выполняемые,
# если условие истинно
}
# продолжение программы
Обратите внимание, что после
if ($count % 2 == 1) { # остаток от деления на 2 равен 1
print $count;
}
Другая общеизвестная форма условного предложения содержит блок, выполняемый при ложном условии, а именно:
if (условие) { # проверка истинности условия
# действия, выполняемые,
# если условие истинно
} else {
# действия, выполняемые в противном случае
# (если условие ложно)
}
# продолжение программы
В if или elsif. Она выглядит следующим образом:
if (условие 1) { # проверка истинности 1-го условия
# действия, выполняемые,
# если условие 1 истинно
} elsif (условие 2) { # проверка истинности 2-го условия
# действия, выполняемые,
# если условие 2 истинно
# ... здесь могут быть еще фразы elsif ...
} elsif (условие N) { # проверка истинности N-го условия
# действия, выполняемые,
# если условие N истинно
} else {
# действия, выполняемые,
# если все условия ложны
}
# продолжение программы
При этом выполнится один из блоков действий: соответствующий первому истинному условию или указанный за фразой else. Фраза else может отсутствовать, тогда при всех ложных условиях не делается ничего. Форма условного предложения с elsif заменяет отсутствующий в do- или ).
Иногда требуется подчеркнуть, что, наоборот, ложность условия становится
unless (условие) { # проверка ложности условия
# действия, выполняемые,
# если условие ложно
} else {
# действия, выполняемые
# в противном случае
}
# продолжение программы
Здесь фраза else также может отсутствовать, если при
Как уже известно из предыдущей лекции, выражать условное выполнение действия можно и другим, очень популярным в
($count % 2 == 1) and print $count;
Условное выполнение действия можно также задавать с помощью модификаторов, о которых речь пойдет далее в этой лекции.
Как известно, циклом называется while (называемый также
while (условие) { # проверка истинности условия продолжения
# действия, выполняемые,
# пока условие истинно
}
# продолжение программы
Например, можно воспользоваться таким циклом while для вывода на :
$i = 0;
while ($i < 10) { # повторять, пока счетчик не достиг 10
print "\n", rand; # вывести с новой строки случайное число
$i++; # увеличить счетчик повторений
}
Иногда удобнее для управления циклом задавать условие окончания цикла. В этом случае применяется цикл until, в котором каждый раз перед выполнением
until (условие) { # проверка истинности условия окончания
# действия, выполняемые,
# пока условие ложно
}
# продолжение программы
Предыдущий пример вывода случайных чисел можно переписать с использованием цикла until:
$i = 0;
until ($i == 10) { # закончить, когда счетчик достигнет 10
print "\n", rand; # вывести с новой строки случайное число
$i++; # увеличить счетчик повторений
}
Другая for также применяется для повторения действий с проверкой условия продолжения. Но в нем предусмотрены два дополнительных выражения для управления циклом. Первое из них выполняется один раз перед выполнением цикла, и в нем обычно выполняются начальные действия, такие как
for (первое выражение; условие; второе выражение) {
# действия, выполняемые,
# пока условие истинно
}
# продолжение программы
В заголовке цикла могут отсутствовать одно или оба выражения, а в случае отсутствия условия оно считается истинным. Однако при этом должны оставаться две точки с запятой, разделяющие выражения. Снова перепишем приведенный выше пример, на этот раз используя цикл for:
for ($i=0; $i<10; $i++) { # повторить 10 раз, увеличивая $i
print "\n", rand; # вывести с новой строки случайное число
}
Еще один тип цикла предназначен для перебора всех :
foreach переменная (список) { #
# работа с переменной, содержащей
# текущий элемент обрабатываемого списка
}
Примеры использования цикла будут приведены в лекции 5, посвященной спискам. В ней будет рассмотрено еще несколько конструкций, также выполняющих повторение действий.
В last (аналог в языке C), который прерывает выполнение цикла и переходит к выполнению предложения, следующего за циклом. Например, напечатать 10 случайных чисел от 0 до 0,5 можно так:
$i = 0;
while (1) { # безусловно входим в цикл
$random = rand; # получаем случайное число
if ($i == 10) { # по достижении счетчика 10
last; # ПРЕРЫВАЕМ выполнение цикла
}
if ($random < 0.5) { # числа меньше 0.5
print "\n", $random; # выводим на консоль
$i++; # и увеличиваем счетчик повторений
}
}
# сюда произойдет переход по last
next (аналог в языке C) применяется, когда требуется пропустить выполнение оставшихся предложений в next:
$i = 0;
while ($i < 10) { # пока счетчик не достигнет 10
$random = rand; # получаем случайное число
if ($random > 0.5) { # числа больше 0.5
next; # ПРОПУСКАЕМ действия в теле цикла
}
print "\n", $random; # выводим число на консоль
$i++; # и увеличиваем счетчик повторений
# сюда произойдет переход по next
}
используется, когда нужно повторить выполнение предложений в
$i = 0;
while ($i < 10) { # пока счетчик не достигнет 10
# сюда произойдет переход по redo
$random = rand; # получаем случайное число
if ($random > 0.5) { # числа больше 0.5
redo; # СНОВА НАЧИНАЕМ действия в теле цикла
}
print "\n", $random; # выводим число на консоль
$i++; # и увеличиваем счетчик повторений
}
Во всех рассмотренных циклах может присутствовать необязательный блок next. Действия в блоке не выполняются при переходах по last и . Это может показаться странным, но голый блок рассматривается в и использоваться переходы last, next и . С учетом предложений управления циклом и блока
# может быть заголовок цикла: while, until или for
{
# сюда происходит переход по redo
# действие 1, выполняемое в цикле
if (условие выхода) {
last; # выход из цикла
}
# действие 2, выполняемое в цикле
if (условие продолжения) {
next; # выполнение следующей итерации цикла
}
# действие 3, выполняемое в цикле
if (условие возобновления) {
redo; # выполнение тела цикла сначала
}
# действие N, выполняемое в цикле
# сюда происходит переход по next
} continue {
# действие, выполняемое после нормального завершения цикла
}
# сюда происходит переход по last
Циклы могут быть вложены один в другой. Когда требуется прервать
CYCLE_1:
while (условие продолжения цикла 1) {
CYCLE_2:
while (условие продолжения цикла 2) {
if (условие выхода из всех циклов) {
last CYCLE_1;
}
CYCLE3:
while (условие продолжения цикла 3) {
if (условия прерывания 2-го цикла) {
next CYCLE_2;
}
}
# сюда произойдет переход по next CYCLE_2
}
}
# сюда произойдет переход по last CYCLE_1
Метка может ставиться перед любым предложением. При помощи блока и в языке C. Например, так можно записать только одно $say в зависимости от условия:
SWITCH: {
unless (defined $t) { # если $t не определено
$t = 25; redo SWITCH; # задать значение по умолчанию
}
if ($t < 10) { $say = 'холодно'; last SWITCH; }
if ($t < 18) { $say = 'прохладно'; last SWITCH; }
if ($t < 27) { $say = 'тепло'; last SWITCH; }
$say = 'жарко';
}
print "Сегодня $say\n";
В , в котором также используются метки. С его помощью можно перейти к выполнению помеченной конструкции в текущем или в вызывающем блоке. Но его нельзя применять для перехода в конструкцию, требующую for. Этот
goto МЕТКА;
goto выражение;
goto подпрограмма;
заслуженно порицается теоретиками и практиками программирования, поскольку он сильно запутывает логику выполнения программы. Так что правилами хорошего стиля программирования рекомендуется использовать его только при крайней необходимости. Хотя и можно применить для last.
Порядок выполнения действий в простом предложении можно задавать с помощью модификаторов выражений. За любым выражением может стоять один из следующих модификаторов:
выражение if выражение выражение unless выражение выражение while выражение выражение until выражение выражение foreach список
Модификатор задает условие выполнения (в случае if или unless ) или повторения (в случае while, until или ) выражения. Выражение модификатора вычисляется в первую очередь, хотя и стоит в конце конструкции. Хотя модификаторы похожи на условные и циклические
SWITCH: {
$t = -36, redo SWITCH unless defined $t;
$say = 'холодно', last SWITCH if $t < 10;
$say = 'прохладно', last SWITCH if $t < 18;
$say = 'тепло', last SWITCH if $t < 27;
$say = 'жарко';
}
Иногда удобно задавать повторение действия с помощью циклических модификаторов, например:
++$count, --$sum while (rand < 0.1); $random = rand until $random > 0.7;
Применение модификаторов делает программу легче для понимания, поскольку акцент переносится на основное действие, стоящее в начале предложения. К тому же
В программах на do с последующим блоком, что похоже на do выступает в качестве do делает из блока выражение, значением которого будет значение последнего предложения в блоке. Например, в такой
$result = do { $x=rand; $a=0; } # в $result будет присвоен 0
Чтобы подобное выражение стало простым предложением, после него нужно поставить "точку с запятой". Вот так можно записать третий вариант конструкции выбора, где выражение do будет
SWITCH: {
(defined $t) || do { $t = 15; redo SWITCH; };
($t < 10) do { $say = 'холодно'; last SWITCH; };
($t < 18) do { $say = 'прохладно'; last SWITCH; };
($t < 27) do { $say = 'тепло'; last SWITCH; };
$say = 'жарко';
}
Выражение do, как и любое другое выражение, может использоваться с модификаторами. Например, с его помощью можно организовать циклическое выполнение действий:
do { $sum += rand; } until ($sum > 25);
Но поскольку эта конструкция - выражение, а не цикл, то
Иногда требуется
eval выражение # вычислить выражение как код на Perl eval блок # выполнить блок, перехватывая возможные ошибки
В любой форме возвращает значение последнего как исходный код на возвращает
$x = 0; $y = 5; # в выражении будет деление на 0
$expression = "$y/$x"; # строка, содержащая код для выполнения
$result = eval ($expression); # вычислить выражение
if ($@ eq '') { # проверить специальную переменную на ошибки
print "Выражение вычислено: $result";
} else {
print "Ошибка вычисления: $@";
}
Во второй форме блок предложений в конструкции , как и в конструкции do, становится выражением. Он компилируется обычным образом и выполняется во время работы программы, но возможные ошибки его выполнения также не приводят к аварийному завершению программы. будет значение последнего предложения в блоке. Вот пример обработки ошибок в выражении :
$result = eval { # выполнить блок
$x = 0; $y = 5;
$z = $y / $x; # здесь будет деление на 0
}; # завершаем предложение точкой с запятой
unless ($@) { # проверить специальную переменную на ошибки
print "Выражение вычислено: $result";
} else {
print "Ошибка вычисления: $@";
}
В программе на
use strict; # ограничить применение небезопасных конструкций use warnings; # выводить подробные предупреждения компилятора use diagnostics; # выводить подробную диагностику ошибок
Дополнительная диагностика
use integer; # включить целочисленные вычисления print 10 / 3; # результат: 3 no integer; # отключить целочисленные вычисления print 10 / 3; # результат: 3.33333333333333
С помощью прагмы use можно определять в программе
use constant PI => 3.141592653; # число пи
С помощью прагмы use в программе включается действие национальных системных установок для некоторых
use locale;
По ходу изучения материала следующих лекций будут рассмотрены другие полезные прагмы, а в лекции 13 будет описано применение use для подключения внешних модулей.
Материал этой лекции иллюстрирует упоминавшийся в лекции 1 принцип TIMTOWTDI: в
# 1. Выполнять бесконечный цикл
for (;;) # читается "forever" - "всегда"
{ } # тело бесконечного цикла
# 2. Открыть файл или аварийно завершить программу
open FILE or die; # "открой файл или умри!"
# 3. Читать строки из входного потока и печатать их,
# используя буферную переменную по умолчанию
while (<>) { print; }
# 4. Присвоить переменной значение по умолчанию
# только, если ее значение не определено
$variable ||= $default_value;
В большинстве следующих лекций будут встречаться и другие идиоматические выражения, придающие специфический колорит программам на языке
Каждый автор волен оформлять свои программы в удобном для него стиле.
perldoc perlstyle
В соответствии c устоявшимися традициями, типичная программа на языке
# вводные комментарии к программе use strict; # включение дополнительной... use warnings; # ... диагностики # use Env; # подключение нужных модулей (см. лекцию 13) # package main; # объявление пакета (см. лекцию 13) my $message = 'Привет!'; # объявление переменных и print $message; # запись алгоритма программы # описание форматов отчета (см. лекцию 10) # описание подпрограмм (см. лекцию 12) __END__ # необязательное обозначение конца программы
В этой лекции рассмотрены синтаксические правила составления предложений на языке
perldoc perlsyn
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.