2009-10-18 5 views
12

Est-ce que quelqu'un sait ce que parser, ou les décisions précédence ont donné lieu à la mise en garde «L'utilisation de « changement » sans parenthèses est ambigu pour le code émis étant comme:Pourquoi l'avertissement "Utiliser de" décalage "sans parenthèses est ambigu" émis par Perl?

shift . 'some string'; 

# and not 

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

Est-ce intentionnel de faire certaines constructions syntaxiques plus facile? Ou est-ce simplement un artefact de la façon dont l'analyseur de perl fonctionne?

Note: Ceci est une discussion sur la conception de la langue, pas un endroit pour suggérer

"@{[shift]}some string" 

Répondre

25

Avec use diagnostics, vous obtenez le message utile:

 
    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. 

La crainte est que vous pourriez écrire quelque chose comme shift .5 et il sera analysé comme shift(0.5).

+0

Je voudrais upvote, mais "ma limite de vote quotidien est atteinte." Je pense que c'est un bug, parce que je pense que SO est tombé pendant quelques minutes juste au moment où il était censé se réinitialiser, alors je suis pénalisé pour avoir voté hier. –

+0

dans le cas de rand (; $) je peux voir un cas pour l'avertissement, cependant, avec le décalage ne semble pas être, puisque le prototype de décalage (; \ @) empêcherait une chaîne ou un nombre d'être un argument valide –

+1

@Eric Strom: cette erreur vient du tokenizer, qui n'est pas si intelligent. Indépendamment, le prototype de shift n'est pas vraiment (; \ @), car cela en ferait un opérateur de liste et c'est en fait un opérateur unaire. – ysth

8

Ambigu ne signifie pas vraiment ambiguë, juste ambiguë dans la mesure où l'analyseur avait déterminé. . peut commencer un terme (par exemple .123) ou un opérateur, donc il ne sait pas assez pour décider si ce qui suit est l'opérande de décalage ou un opérateur pour lequel shift() est l'opérande (et l'analyseur n'est pas assez intelligent pour savoir que: a) le . n'est pas le début d'un tel terme ou b) .123 n'est pas un opérande valide pour le décalage).

Questions connexes