Выбрать главу

Логические операции создают логический контекст выражения, поэтому эти операции возвращают строку '1' при истинном значении выражения и пустую строку (''), если оно ложное. Обозначение традиционных логических операций в Perl также заимствованы из языка C:

! логическое НЕ (например, ! undef($x) )

&& логическое И (например, $d >= 1 && $d <= 31 )

|| логическое ИЛИ (например, $m eq 'Dec' || $m eq 'Jan')

Результат операции логическое И будет истинным лишь тогда, когда истинны оба операнда, причем второй операнд вычисляется только тогда, когда первый операнд истинный). Операция логическое ИЛИ возвращает истинный результат, если один из операндов истинный, при этом второй операнд вычисляется только тогда, когда первый операнд ложный. Операция логическое НЕ (или логическое отрицание) меняет значение своего операнда на противоположное. Особенности вычисления логических операций часто применяются в Perl для выполнения действий в зависимости от условия. Например, вывести на печать результат при условии, если он положителен, можно так:

$result > 0 && print $result;

В языке Perl есть еще один набор логических операций, так называемых логических операций с низким приоритетом. Они эквивалентны упомянутым выше логическим операциям, но имеют почти самый низкий приоритет по сравнению с другими операциями.

not логическое НЕ (например, not undef($x))

and логическое И (например, $d >= 1 and $d <= 31)

or логическое ИЛИ (например, $m eq 'D' or $m eq 'J' or $m eq 'F')

xor логическое ИСКЛЮЧАЮЩЕЕ ИЛИ (например, $d==1 xor $m eq 'J')

Операция логическое ИСКЛЮЧАЮЩЕЕ ИЛИ возвращает истинный результат, если операнды имеют различное значение, а когда оба операнда имеют одинаковое значение (истинное или ложное), то эта операция возвращает "ложь". Низкоприоритетные логические операции тоже применяются для условного выполнения действий.

Побитовые операции (bitwise operators) выполняются над двоичными разрядами операндов. Унарная операция побитовое НЕ (или побитовое отрицание, или побитовое дополнение) меняет каждый разряд операнда на противоположный. Бинарные операции побитовое И, побитовое ИЛИ и побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ выполняют соответствующую двоичную операцию поразрядно над левым и правым операндами. Если операнды числовые, то они преобразуются в целые числа, имеющие гарантированную длину не менее 32 разрядов.

~ побитовое НЕ (~ 0b1101 даст результат 0b0010)

& побитовое И (0b1010 & 0b0110 даст результат 0b0010)

| побитовое ИЛИ (0b1010 | 0b0110 даст результат 0b1110)

^ побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ (0b1010 ^ 0b0110 даст 0b1100)

Эти операции могут выполняться над строками. При этом выполняются поразрядные операции над соответствующими битами двух строк, и считается, что более короткая строка дополняется в конце нулевыми разрядами до размера длинной.

Бинарные побитовые операции сдвига выполняются над двоичными разрядами целого числа: значение левого операнда поразрядно сдвигается влево или вправо на число разрядов, указанное правым операндом. При этом освобождающиеся двоичные разряды заполняются нулями.

<< побитовый сдвиг влево (0b1010 << 2 даст результат 0b101000)

>> побитовый сдвиг вправо (0b1010 >> 3 даст результат 0b000001)

В Perl есть бинарные операции, применяемые только к строкам: конкатенация (или сцепление) двух строк, обозначаемая символом "точка", и репликация (или повторение), обозначаемая латинской строчной буквой "x", поскольку в результате этой операции строка "умножается" указанное число раз.

. конкатенация (например, 'X' . '=' . '25' даст строку 'X=25')

x репликация (например, 'Дa!' x 3 даст в результате строку 'Дa!Дa!Дa!')

Операция сцепления создает строковый контекст. Поэтому если ее операнды - числа, то они преобразуются в строки, например:

'100' . '3' даст в результате строку '1003'

100 . 3 тоже даст в результате строку '1003'

В левой части операции повторения ожидается строка, а в правой - число повторений. Если в правой части операции повторения стоит строка, то она преобразуется к числу. Причем, если правый операнд операции повторения - дробный, то берется его целое значение, а если он отрицательный или равен нулю, то результатом повторения будет пустая строка: