Operador ternario e impresión

10

Lo que está mal con el siguiente comando

awk 'BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}'

Salida:

awk: BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}
awk:                           ^ syntax error
Mohammad Adil
fuente

Respuestas:

25

Como muchos otros lenguajes de programación, awkdistingue entre expresiones y declaraciones. En general, las declaraciones son acciones que se llevan a cabo, mientras que las expresiones son cálculos que dan como resultado un valor.

El operador ternario en awk, como su contraparte en C de donde proviene, es en sí mismo una expresión (no una declaración) que espera otras tres expresiones como expr1 ? expr2 : expr3. printEs una declaración. No se puede usar donde se solicita una expresión, de ahí el error de sintaxis.

¿Lo has intentado awk 'BEGIN {a = 5;b=6; print (a==b)? "a==b" : "a!=b"}'?

El uso de una declaración donde se solicita una expresión no puede tener ningún sentido. Las declaraciones no devuelven valores. Entonces, cuando tiene condition ? stmt1 : stmt2, ¿cuál es el valor calculado por el operador ternario? Si conditiones falso, debería ser el valor de stmt2pero no es un valor, es una acción.

Celada
fuente
Hay otros idiomas en los estados hacen valores de retorno (rubí viene a la mente), pero esto es una respuesta perfecta para la pregunta.
Glenn Jackman
Gracias por esa aclaración, @glennjackman. No conozco a Ruby, así que tal vez no sé de lo que estoy hablando, pero mi primer pensamiento al leer su comentario fue que supongo que eso significa que en las declaraciones de Ruby son expresiones .
Celada
sí, puedes hacer cosas como este ejemplo inútil:x = if true; print "yes"; else; print "no"; end
glenn jackman
Supongo que esto niega la posibilidad de una construcción como (cond1) ? printf("str1") : printf("str2")? Gracias por explicar las sutilezas del ternario. EDIT: de hecho, utilizando la siguiente construcción fea: str = (cond1) ? sprintf("str1") : sprintf("str2"); printf("%s", str)obras, pero en este momento es casi tan compacto y mucho más clara de usar if / else :)
isosceleswheel
considere usar printf si no desea imprimir líneas vacías para condiciones incomparables
tuxErrante