Opérateur ternaire et impression

10

Quel est le problème avec la commande ci-dessous

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

Production :

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

Réponses:

25

Comme beaucoup d'autres langages de programmation, fait la awkdistinction entre les expressions et les instructions. Dans l'ensemble, les instructions sont des actions qui sont exécutées, tandis que les expressions sont des calculs qui aboutissent à une valeur.

L'opérateur ternaire dans awk, comme son homologue en C d'où il vient, est lui-même une expression (et non une instruction) qui attend trois autres expressions comme expr1 ? expr2 : expr3. printest une déclaration. Il ne peut pas être utilisé là où une expression est requise, d'où l'erreur de syntaxe.

As-tu essayé awk 'BEGIN {a = 5;b=6; print (a==b)? "a==b" : "a!=b"}'?

L'utilisation d'une instruction dans laquelle une expression est demandée n'a aucun sens. Les instructions ne renvoient pas de valeurs. Donc, quand vous l'avez condition ? stmt1 : stmt2, quelle est la valeur calculée par l'opérateur ternaire? Si conditionest faux, ce devrait être la valeur de stmt2mais ce n'est pas une valeur, c'est une action.

Celada
la source
Il existe d' autres langues où les déclarations font valeurs de retour (rubis vient à l' esprit), mais cela est une réponse parfaite pour la question.
glenn jackman
Merci pour cette précision, @glennjackman. Je ne connais pas Ruby alors peut-être que je ne sais pas de quoi je parle, mais ma première pensée à la lecture de votre commentaire était cette supposition qui signifie que dans les déclarations Ruby , ce sont des expressions .
Celada
oui, vous pouvez faire des trucs comme cet exemple inutile:x = if true; print "yes"; else; print "no"; end
glenn jackman
Je suppose que cela annule la possibilité d'une construction comme (cond1) ? printf("str1") : printf("str2")? Merci d'expliquer les subtilités du ternaire. EDIT: en fait, en utilisant la construction laide suivante: str = (cond1) ? sprintf("str1") : sprintf("str2"); printf("%s", str)fonctionne, mais à ce stade, c'est presque aussi compact et beaucoup plus clair à utiliser si / autre :)
isosceleswheel
pensez à utiliser printf si vous ne voulez pas imprimer de lignes vides pour des conditions inégalées
tuxErrante