2009-10-18 21 views
12

¿Alguien sabe qué análisis sintáctico de precedencia o decisiones dieron lugar a la advertencia de uso de 'cambio' sin paréntesis es ambigua 'que se emiten por un código como:¿Por qué la advertencia "Uso de" cambio "sin paréntesis es ambigua" emitida por Perl?

shift . 'some string'; 

# and not 

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

¿Es esta intencionado para hacer ciertas construcciones sintácticas más fácil? ¿O es simplemente un artefacto de la forma en que funciona el analizador de perl?

Nota: esta es una discusión sobre el diseño del lenguaje, no un lugar para sugerir

"@{[shift]}some string" 

Respuesta

25

Con use diagnostics, se obtiene el mensaje de ayuda:

 
    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. 

El temor es que podría escribir algo así como shift .5 y se analiza como shift(0.5).

+0

Yo renuncié, pero "se alcanzó mi límite diario de votos". Creo que es un error, porque creo que SO bajó por unos minutos justo en el momento en que se suponía que debía reiniciarse, por lo que me están penalizando por haber votado ayer. –

+0

en el caso de rand (; $) Puedo ver un caso para la advertencia, sin embargo, con shift no parece haberlo, ya que el prototipo de shift (; \ @) evitaría que una cadena o número fuera un argumento válido –

+1

@Eric Strom: este error proviene del tokenizer, que no es tan inteligente. Sin tener en cuenta, el prototipo de shift no es realmente (; \ @), ya que eso lo convertiría en un operador de lista y, de hecho, es un operador unario. – ysth

8

ambiguo no significa realmente ambigua, simplemente ambigua en lo que había determinado el analizador. shift . en particular es ambiguo porque . puede comenzar un término (ej. .123) o un operador, por lo que no sabe lo suficiente para decidir si lo siguiente es el operando de shift o un operador para el cual shift() es el operando (y el analizador no es lo suficientemente inteligente como para saber que: a) el . no es el comienzo de dicho término o b) .123 no es un operando válido para el cambio).

Cuestiones relacionadas