Подтвердить что ты не робот

Почему "использование" сдвига без круглых скобок является двусмысленным предупреждением, выпущенным Perl?

Кто-нибудь знает, какие решения по синтаксическому анализу или приоритету привели к предупреждению "Использование" сдвига "без круглых скобок является двусмысленным", выпущенному для кода типа:

shift . 'some string';

# and not

(shift) . 'some string'; # or
shift() . 'some string';

Является ли это намеренным упростить некоторые синтаксические конструкции? Или это просто артефакт о том, как работает Perl-парсер?

Примечание: это обсуждение дизайна языка, а не предложение предложить

"@{[shift]}some string"
4b9b3361

Ответ 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 не является допустимым операндом для сдвига).