Логические операции
В языке 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( ),
отображающей сообщение и прекращающей дальнейшее выполнение сценария.