Как и следовало ожидать, Perl содержит все необходимые логические операторы для работы с логическими (булевскими) значениями true/ false. Например, логические условия часто объединяются логическими операторами AND (&&) и OR (||):
if ($dessert{'cake'} && $dessert{'ice cream'}) {
# Оба условия истинны
print "Hooray! Cake and ice cream!\n";
} elsif ($dessert{'cake'} || $dessert{'ice cream'}) {
# По крайней мере, одно условие истинно
print "That's still good...\n";
} else {
# Оба условия ложны - ничего не делать
}
В некоторых ситуациях применяется ускоренное вычисление выражения. Если левая сторона логической операции AND ложна, то все выражение заведомо ложно, поскольку логический оператор AND возвращает истинное значение только в случае истинности обоих операндов. В нашем случае проверять правую сторону не нужно, поэтому она даже не обрабатывается. Что произойдет, если в приведенном примере переменная $hour равна 3:
if ( (9 <= $hour) && ($hour < 17) ) {
print "Aren't you supposed to be at work...?\n";
}
Аналогично при истинности левой стороны логической операции OR правая сторона также не вычисляется. Допустим, в следующем выражении переменная $name содержит строку fred:
if ( ($name eq 'fred') || ($name eq 'barney') ) {
print "You're my kind of guy!\n";
}
Из-за этой особенности такие операторы называют «ускоренными» (short-circuit). Там, где это возможно, они стараются придти к результату самым быстрым путем. Ускоренное вычисление результата логическими операторами часто используется в программах. Возьмем пример с вычислением среднего значения:
if ( ($n != 0) && ($total/$n < 5) ) {
print "The average is below five.\n";
}
В этом примере правая сторона вычисляется только в том случае, если левая сторона истинна. Это предотвращает возможность случайного деления на нуль с аварийным завершением программы.