Некоторые случаи применения логических операций показаны в табл. 4.6 при условии, что
используемые в них переменные имеют значения:
$m = 10;
$n = "string";
@h = (10, 20, 30);
Талица 4.6. Логические операции
Выражение |
Булевый контекст |
Небулевый контекст |
$rez = !$n |
«Ложь» |
"" |
$rez = $n || $m |
«Истина» |
"string" |
$rez = 0 || $m |
«Истина» |
10 |
$rez = $n && $m |
«Истина» |
10 |
$rez = 0 && $m |
«Ложь» |
0 |
@rez = $n && @h |
«Истина» |
10 20 30 |
Примечание. В табл. 4.6. в столбце, отражающем значения логических операций в небулевом
контексте, представлены значения переменных из левой части соответствующих операций присваивания.
Кроме этих трех операций логического сравнения в язык введены низкоприоритетные операции
логического сравнения or, and, not и xor, первые три из которых полностью аналогичны рассмотренным
логическим операциям ||, && и !, а последняя операция хоr реализует функцию исключающего ИЛИ с
таблицей истинности, представленной в табл. 4.7.
Таблица 4.7. Таблица истинности исключающего ИЛИ
Операнд 1 \ Операнд2 |
«Ложь» |
«Истина» |
«Ложь» |
«Ложь» |
«Истина» |
«Истина» |
«Истина» |
«Ложь» |
Все эти четыре операции ничем не отличаются от рассмотренных выше логических операций, но
имеют самый низкий приоритет при вычислении сложных выражений, в которые они входят. (О приоритете
операций при вычислении сложных выражений мы будем говорить в конце этой главы.) Низкоприоритетные
операции логического ИЛИ (or) и И (and), как и их более приоритетные двойники, вычисляются по
укороченной схеме.
Свойство логических операций ИЛИ и И языка Perl вычисляется по укороченной схеме и используется
для управления некоторыми исключительными ситуациями, которые могут возникнуть в программе в процессе
вычислений. Например, с помощью операции логического ИЛИ можно избежать деления на нуль в программе:
($x == 0) || ($m = 1/$x)
При вычислении результата этой операции сначала вычисляется левый операнд, который сравнивает
значение переменной $х с нулем. Если это значение действительно равно нулю, то результатом операции
сравнения будет «истина», а поэтому второй операнд операции логического ИЛИ не вычисляется, так как
его значение не влияет на результат вычисления логической операции. В результате не возникает
ситуации деления на нуль. Если значение переменной $х не равно нулю, то первый операнд операции ||
будет «ложь», что приведет к обязательному вычислению ее второго операнда, в котором осуществляется
деление на не равную нулю переменную $х.
Подобным же образом любую из логических операций ИЛИ языка Perl можно использовать при анализе
выполнения некоторых действий, например открытия файла:
open(POST, "file.txt") or
die "Невозможно открыть файл file.txt!";
Левый операнд этой логической операции возвращает 1 в случае успешного открытия файла и 0 в случае
возникновения проблем с открытием файла. В первом случае результат операции or известен и без
вычисления второго операнда, а во втором случае будет выполнен ее второй операнд, который представляет
собой вызов встроенной функции
die( ),
отображающей сообщение и прекращающей дальнейшее выполнение сценария.