Логические операции

В языке Perl определены три операции логического сравнения, реализующие известные булевы функции: || (логическое ИЛИ), && (логическое И) и ! (логическое отрицание НЕ). Первые две являются бинарными операциями, а последняя — унарной. Результат их выполнения полностью совпадает соответственно с булевыми функциями дизъюнкции (ИЛИ), конъюнкции (И) и отрицания (НЕ), задаваемых своими таблицами истинности
Таблица 4.3. Таблица истинности дизъюнкции (ИЛИ)
Операнд 1 \ Операнд2 «Ложь» «Истина»
«Ложь» «Ложь» «Истина»
«Истина» «Истина» «Истина»
Таблица 4.4. Таблица истинности конъюнкции (И)
Операнд 1 \ Операнд2 «Ложь» «Истина»
«Ложь» «Ложь» «Ложь»
«Истина» «Ложь» «Истина»
Таблица 4.5. Таблица истинности отрицания (НЕ)
Операнд Результат
«Ложь» «Истина»
«Истина» «Ложь»
В Perl нет специальных литералов для представления значений «истина» и «ложь». В качестве значения «ложь» принимается одно из следующих скалярных значений: пустая строка "", целое число 0 или его строковый эквивалент — строка "0". Любая скалярная величина, отличная от указанных, интерпретируется в булевом контексте как «истина».
Логические операции не предоставляют булева контекста для своих операндов. Каждый из них вычисляется в том контексте, который ему необходим. Например, если в качестве одного из операндов используется массив или функция, то он будет вычисляться в списковом контексте, а если скалярная величина, то в скалярном. Полученные значения интерпретируются как «истина» или «ложь» для выяснения результата всей операции, когда она вычисляется в булевом контексте.
В Perl вычисление логических операций ИЛИ и И осуществляется по укороченной схеме, что непосредственно связано со смыслом этих операций. Если при вычислении операции ИЛИ определено, что значение ее первого операнда в булевом контексте — «истина», то при любом значении второго операнда результатом всей операции будет «истинам, поэтому нет смысла вообще вычислять второй операнд. Аналогично для операции логического И: если значение первого операнда трактуется как «ложь», то результат всей операции — «ложь», вне зависимости от значения второго операнда. В небулевом контексте результатом выполнения этих операций является значение последнего вычисленного операнда.
Результатом операции ! (НЕ) всегда является значение 1, если она вычисляется как «истина», и пустая строка ("") в противном случае вне зависимости от используемого контекста.
Некоторые случаи применения логических операций показаны в табл. 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( ), отображающей сообщение и прекращающей дальнейшее выполнение сценария.

Следующая страница Содержание главы


Реклама