Это из-за категории операторов, под которой подпадает //
, а также ==
.
==
является " оператором равенства ", хотя //
подпадает подкатегория « логические операторы в стиле C ».
В качестве примера;&&
находится в той же « категории », что и //
, при этом оба приведенных ниже утверждения эквивалентны, когда речь идет о приоритете оператора.Это может облегчить понимание?
print "hello world" if $may_be_undefined && 0 == 2;
print "hello world" if $may_be_undefined // 0 == 2;
Документация в стиле C Logical Defined-Or (//)
Хотя он не имеет прямого эквивалента в C, оператор Perl // связан с его стилем C или.Фактически, он точно такой же, как ||, за исключением того, что он проверяет определенность левой части вместо ее истинности.
Таким образом, $ a // $ b аналогичен определенному ($ a)||$ b (за исключением того, что он возвращает значение $ a, а не значение, определенное ($ a)) и дает такой же результат, как определено ($ a)?$ a: $ b (за исключением того, что форма тернарного оператора может использоваться как l-значение, а $ a // $ b не может).
Это очень полезно для предоставления значений по умолчанию для переменных.Если вы действительно хотите проверить, определен ли хотя бы один из $ a и $ b, используйте определено ($ a // $ b).
Операторы ||, // и && возвращают последнее оцененное значение(в отличие от C || и &&, которые возвращают 0 или 1).
Документация приоритета оператора и ассоциативности