Что не так с print (2 & 2) >> 1? - PullRequest
1 голос
/ 12 июня 2019

Мне просто интересно, что происходит с этим фрагментом кода.Почему результат неверен только при прямой печати, почему перевод строки игнорируется?

user@host_09:22 AM: perl
print 2 >> 1, "\n";
print 2 & 2, "\n";
print (2 & 2) >> 1, "\n";
1
2
2user@host_09:22 AM: perl
$a = (2 & 2) >> 1;
print "$a\n";
1

Ответы [ 2 ]

6 голосов
/ 12 июня 2019

Perl интерпретирует круглые скобки как маркер аргументов функции, что можно проверить с помощью

perl -MO=Deparse,-p -e 'print (2 & 2) >> 1'

Вывод:

(print(2) >> 1);

Канонический способ состоит в том, что перед левой скобкой ставится +:

print +(2 & 2) >> 1
4 голосов
/ 12 июня 2019

Когда вы печатаете его с предупреждениями, становится ясно (er)

perl -we'print (2 & 2), "\n"'

говорит

print (...) interpreted as function at -e line 1.
Useless use of a constant ("\n") in void context at -e line 1.

Он работает print(2&2) как вызов функции к print, который печатает 2, а затем продолжает вычислять оператор запятой , с "\n" в пустом контексте следующим, который предупреждает нас около.

С >> 1 также здесь, возвращаемое 1 из print(2&2) (для успеха) немного сдвинуто к 0, которое исчезает в пустоте, и мы получаем другой " бесполезное использование ... в пустом контексте ."

Одним из исправлений является добавление +, чтобы дать интерпретатору понять, что ( предназначено для выражения

perl -we'print +(2 & 2) >> 1, "\n"'

Или, сделайте правильный вызов print, с круглыми скобками вокруг всего этого

perl -we'print((2 & 2) >> 1, "\n")'

Оба печатают строку с 1.

Это упомянуто в print и более полно задокументировано в Термины и операторы Списка и в Символьные унарные операторы , оба в perlop .

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