Составные операторы
Обычно выражение условия представляет собой сложное выражение, составленное из операций отношения, связанных логическими операциями. Использование операции присваивания в выражении условия оператора if не совсем типично. Здесь мы его использовали, чтобы подчеркнуть то обстоятельство, что в Perl любое правильное выражение может быть использовано в качестве выражения условия, которое вычисляется в булевом контексте. Вторая форма оператора if используется, когда необходимо выполнить одну группу операторов (БЛОК!) в случае истинности некоторого выражения (ВЫРАЖЕНИЕ), а в случае его ложности – другую группу операторов (влок2):
if ($var >= 0} # ВЫРАЖЕНИЕ { print "Переменная неотрицательна."; # БЛОК1, если ВЫРАЖЕНИЕ истинно } else { print "Переменная отрицательна."; # БЛОК2, если ВЫРАЖЕНИЕ ложно }
По существу, первая форма оператора if эквивалентна второй форме, если БЛОК2 не содержит ни одного оператора.
Последняя, третья форма оператора if реализует цепочку ветвлений. Семантика этого оператора такова. Выполняются операторы из БЛОК!, если:
ИСТИННО ВЫРАЖЕНИЕ!. ЕСЛИ ОНО ЛОЖНО, ТО ВЫПОЛНЯЮТСЯ Операторы ИЗ БЛОК2
…в случае истинности выражение2. Если и оно ложно, то проверяется ВЫРАЖЕНИЕ З и т. д. Если ни одно из выражений условия оператора if не истинно, то выполняются операторы блока, определяемого после ключевого слова else в случае его наличия. В противном случае выполняется следующий после оператора if оператор программы. При выполнении следующего оператора ветвления if:
if($var < 0) { # ВЫРАЖЕНИЕ! print "Переменная отрицательна"; i БЛОК! } elsif ($var == 0) { # ВЫРАЖЕНИЕ2 print "Переменная равна нулю"; # БЛОК2 } else { print "Переменная положительна"; # БЛОКЗ }
…сначала проверяется условие отрицательности переменной $var. Если значение переменной строго меньше нуля (ВЫРАЖЕНИЕ1), то печатается сообщение из БЛОК! и оператор завершает свою работу. Если значение переменной не меньше нуля, то оно проверяется на равенство (ВЫРАЖЕНИЕ2) и в случае истинности выполняется оператор печати из блока операторов elsif (влок2). Если проверка на равенство нулю дала ложный результат, то выполняется оператор печати из блока операторов else (БЛОКЗ).
Замечание
Ключевое слово else вместе со своим блоком операторов может быть опущено.
В операторе if со множественными проверками может быть сколько угодно блоков elsif, но только один блок else.
Так как все операторы ветвления определяются в терминах блоков операторов, то не возникает двусмысленности при определении, какие операторы в какой части выполняются.
При работе с операторами ветвления важно помнить, что только один блок операторов будет выполнен – тот, для которого истинно соответствующее выражение условия.
Во всех операторах ветвления ключевое слово if может быть заменено на unless. В этом случае проверка выражения условия осуществляется на его ложность. Последний оператор if можно записать и так:
unless($var >= 0} { # ВЫРАЖЕНИЕ! print "Переменная отрицательна"; # БЛОК! } elsif ($var == 0) { # ВЫРАЖЕНИЕ2 print "Переменная равна нулю"; # БЛОК2 } else { print "Переменная положительна"; # БЛОКЗ }
При этом нам пришлось заменить ВЫРАЖЕНИЕ! на противоположное по смыслу.
Замечание
Все операторы if (unless) могут быть вложенными, т. е. в любом их блоке можно свободно использовать другие операторы ветвления.