Почему "использование" сдвига без круглых скобок является двусмысленным предупреждением, выпущенным Perl?
Кто-нибудь знает, какие решения по синтаксическому анализу или приоритету привели к предупреждению "Использование" сдвига "без круглых скобок является двусмысленным", выпущенному для кода типа:
shift . 'some string';
# and not
(shift) . 'some string'; # or
shift() . 'some string';
Является ли это намеренным упростить некоторые синтаксические конструкции? Или это просто артефакт о том, как работает Perl-парсер?
Примечание: это обсуждение дизайна языка, а не предложение предложить
"@{[shift]}some string"
Ответы
Ответ 1
С помощью use diagnostics
вы получите полезное сообщение:
Warning: Use of "shift" without parentheses is ambiguous at (eval
9)[/usr/lib/perl5/5.8/perl5db.pl:628] line 2 (#1)
(S ambiguous) You wrote a unary operator followed by something that
looks like a binary operator that could also have been interpreted as a
term or unary operator. For instance, if you know that the rand
function has a default argument of 1.0, and you write
rand + 5;
you may THINK you wrote the same thing as
rand() + 5;
but in actual fact, you got
rand(+5);
So put in parentheses to say what you really mean.
Страх в том, что вы можете написать что-то вроде shift .5
, и оно будет проанализировано как shift(0.5)
.
Ответ 2
Неоднозначность не означает поистине неоднозначную, просто двусмысленную, насколько определил парсер.
shift .
в частности, является "неоднозначным", поскольку .
может начинать термин (например, .123
) или оператор,
поэтому он не знает достаточно, чтобы решить, следует ли следующее: операнд сдвига или оператор, для которого shift() является операндом (и синтаксический анализатор недостаточно умен, чтобы знать, что: a) .
не является началом такого термина или b) .123
не является допустимым операндом для сдвига).