Ternärer Operator und Druck


10

Was ist los mit dem folgenden Befehl

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

Ausgabe :

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

Antworten:


25

awkUnterscheidet wie viele andere Programmiersprachen zwischen Ausdrücken und Anweisungen. Anweisungen sind im Großen und Ganzen Aktionen, die ausgeführt werden, während Ausdrücke Berechnungen sind, die zu einem Wert führen.

Der ternäre Operator in awkist wie sein Gegenstück in C, aus dem er stammt, selbst ein Ausdruck (keine Aussage), der drei weitere Ausdrücke als erwartet expr1 ? expr2 : expr3. printist eine Aussage. Es kann nicht verwendet werden, wenn ein Ausdruck erforderlich ist, daher der Syntaxfehler.

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

Die Verwendung einer Anweisung, bei der ein Ausdruck erforderlich ist, kann keinen Sinn ergeben. Anweisungen geben keine Werte zurück. Wenn ja condition ? stmt1 : stmt2, welchen Wert berechnet der ternäre Operator? Wenn conditiones falsch ist, sollte es der Wert von sein, stmt2aber das ist kein Wert, es ist eine Aktion.


Es gibt auch andere Sprachen , in denen Aussagen zu tun Rückgabewerte (Rubin in den Sinn kommt), aber dies ist eine perfekte Antwort auf die Frage.
Glenn Jackman

Vielen Dank für diese Klarstellung, @glennjackman. Ich kenne Ruby nicht, also weiß ich vielleicht nicht, wovon ich spreche, aber mein erster Gedanke beim Lesen Ihres Kommentars war die Vermutung, dass es sich bei Ruby- Aussagen um Ausdrücke handelt .
Celada

Ja, Sie können x = if true; print "yes"; else; print "no"; end
Dinge

Ich denke, das negiert die Möglichkeit einer Konstruktion wie (cond1) ? printf("str1") : printf("str2")? Vielen Dank, dass Sie die Feinheiten des Ternären erklärt haben. EDIT: in der Tat mit der folgenden hässlichen Konstruktion: str = (cond1) ? sprintf("str1") : sprintf("str2"); printf("%s", str)funktioniert, aber an diesem Punkt ist es fast genauso kompakt und viel klarer zu verwenden, wenn / sonst :)
gleichschenkliges

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.