Operador ternário e impressão

10

O que há de errado com o comando abaixo

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

Resultado :

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

Respostas:

25

Como muitas outras linguagens de programação, awkdistingue expressões e declarações. De um modo geral, instruções são ações executadas, enquanto expressões são computações que resultam em um valor.

O operador ternário em awk, como seu equivalente em C de onde vem, é ele próprio uma expressão (não uma declaração) que espera três outras expressões como expr1 ? expr2 : expr3. printé uma afirmação. Ele não pode ser usado onde uma expressão é solicitada, daí o erro de sintaxe.

Você já tentou awk 'BEGIN {a = 5;b=6; print (a==b)? "a==b" : "a!=b"}'?

Usar uma declaração em que uma expressão é chamada não pode fazer sentido. Instruções não retornam valores. Então, quando você tem condition ? stmt1 : stmt2, qual é o valor calculado pelo operador ternário? Se conditionfor falso, deve ser o valor de, stmt2mas não é um valor, é uma ação.

Celada
fonte
Há outras línguas onde declarações fazer valores de retorno (rubi vem à mente), mas esta é uma resposta perfeita para a questão.
Glenn Jackman
Obrigado por esse esclarecimento, @glennjackman. Eu não conheço Ruby, então talvez eu não saiba do que estou falando, mas meu primeiro pensamento ao ler seu comentário foi esse palpite que significa que nas declarações de Ruby são expressões .
Celada
sim, você pode fazer coisas como este exemplo inútil:x = if true; print "yes"; else; print "no"; end
Glenn Jackman
Eu acho que isso nega a possibilidade de uma construção como (cond1) ? printf("str1") : printf("str2")? Obrigado, explicando as sutilezas do ternário. EDIT: na verdade, usando a seguinte construção feio: str = (cond1) ? sprintf("str1") : sprintf("str2"); printf("%s", str)obras, mas neste momento é quase tão compacto e muito mais claro para usar if / else :)
isosceleswheel
considerar o uso de printf se você não quiser imprimir linhas vazias para condições incomparáveis
tuxErrante