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
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:
awk
Unterscheidet 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 awk
ist 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
. print
ist 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 condition
es falsch ist, sollte es der Wert von sein, stmt2
aber das ist kein Wert, es ist eine Aktion.
x = if true; print "yes"; else; print "no"; end
(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 :)