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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.