Когда вы печатаете его с предупреждениями, становится ясно (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 .