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

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.