Почему // имеет более низкий приоритет, чем равенство в Perl? - PullRequest
5 голосов
/ 12 декабря 2011

Почему // имеет более низкий приоритет, чем == в (по крайней мере) perl 5.010?

Например, это

use 5.010;
my $may_be_undefined = 1;
my $is_equal_to_two = ($may_be_undefined//0 == 2);
say $is_equal_to_two;

отпечатков (для меня) очень неожиданный результат.

1 Ответ

13 голосов
/ 12 декабря 2011

Это из-за категории операторов, под которой подпадает //, а также ==.

== является " оператором равенства ", хотя // подпадает подкатегория « логические операторы в стиле 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).


Документация приоритета оператора и ассоциативности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...