Правильное решение — использовать низкоприоритетную операцию логического ИЛИ or:
$m=$n or print "Нуль, пустая строка или не определена!";
или скобками изменить порядок выполнения операций:
($m=$n) || print "Нуль, пустая строка или не определена!";
Завершая разговор о списковых и унарных именованных операциях, следует упомянуть о синтаксической
возможности задания первого (или единственного параметра) в круглых скобках так, чтобы он не
рассматривался как полный список параметров операции, то есть чтобы операция не выглядела как вызов
функции. Для этого следует перед таким параметром поставить префикс +:
sin +(1) * pi; # (sin 1) * pi = 2.64355906408146
Этот префикс не выполняет никакой семантической роли в программе, даже не преобразует параметр в
числовой тип данных. Он просто служит для акцентирования того факта, что sin не является функцией, а
представляет собой унарную именованную операцию. Аналогично он действует и в случае списковых операций:
sort +($var1+$var2)**2, @m;
Эта операция сортирует возведенную в квадрат сумму значений переменных $var1 и $var2 вместе с
элементами массива @m, возвращая массив отсортированных значений. Если убрать префикс + перед
выражением в скобках, то результат выполнения операции sort будет возведен в квадрат.
Сочетаемость операций
Завершая разговор о приоритете выполнения операций, следует объяснить свойство сочетаемости
операций и его практическое применение. Сочетаемость важна при вычислении выражений, содержащих
операции с одинаковым приоритетом, и определяет порядок их вычисления. Рассмотрим выражение:
$m += $n += 1;
Как следует его понимать? Как ($m += $n) += 1 или как $m += ($n += 1)? Ответ дает правило сочетаемости.
Все операции присваивания сочетаются справа налево. Это означает, что сначала
должно выполниться самое правое присваивание $n += 1, а потом результат увеличенной на единицу
переменной $n прибавляется к переменной $m (более левое присваивание). Следовательно, это выражение
эквивалентно следующему:
$m +=($n += 1);
Аналогично применяется правило сочетаемости и к другим операциям языка Perl:
$a>$b<$c; # Эквивалентно: ($a>$b)<$c;
# Сочетаемость: слева направо.
$a**$b**$c; # Эквивалентно: $а**($b**$с):
# Сочетаемость: справа налево
Еще раз напомним об использовании скобок при возникновении сомнения в том, как будет вычисляться
выражение. Скобки изменяют порядок вычислений, определяемый по правилу приоритетов и сочетаемости.
Любое заключенное в скобки подвыражение будет вычисляться с наивысшим приоритетом, так как Perl
рассматривает его как терм, имеющий наивысший приоритет.