Does anyone know what parsing or precedence decisions resulted in the warning ‘Use of “shift” without parentheses is ambiguous’ being issued for code like:
shift . 'some string';
# and not
(shift) . 'some string'; # or
shift() . 'some string';
Is this intentional to make certain syntactic constructs easier? Or is it merely an artifact of the way perl’s parser works?
Note: this is a discussion about language design, not a place to suggest
"@{[shift]}some string"
With
use diagnostics, you get the helpful message: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.The fear is you could write something like
shift .5and it will be parsed likeshift(0.5).