Co jest nie tak z poniższym poleceniem
awk 'BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}'
Wynik :
awk: BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}
awk: ^ syntax error
Podobnie jak wiele innych języków programowania, awk
rozróżnia wyrażenia i instrukcje. Ogólnie rzecz biorąc, instrukcje są działaniami, które są wykonywane, podczas gdy wyrażenia są obliczeniami, które dają wartość.
Potrójny operator w awk
, podobnie jak jego odpowiednik w C, skąd pochodzi, sam jest wyrażeniem (a nie instrukcją), który oczekuje trzech innych wyrażeń jako expr1 ? expr2 : expr3
. print
jest stwierdzeniem. Nie można go użyć tam, gdzie wymagane jest wyrażenie, stąd błąd składniowy.
Próbowałeś awk 'BEGIN {a = 5;b=6; print (a==b)? "a==b" : "a!=b"}'
?
Użycie instrukcji, w której wywoływane jest wyrażenie, nie ma sensu. Instrukcje nie zwracają wartości. Więc kiedy masz condition ? stmt1 : stmt2
, jaką wartość oblicza operator trójskładnikowy? Jeśli condition
jest fałszem, powinna to być wartość, stmt2
ale to nie jest wartość, to akcja.
x = if true; print "yes"; else; print "no"; end
(cond1) ? printf("str1") : printf("str2")
? Dzięki wyjaśniając subtelności trójki. EDYCJA: w rzeczywistości przy użyciu następującej brzydkiej konstrukcji:str = (cond1) ? sprintf("str1") : sprintf("str2"); printf("%s", str)
działa, ale w tym momencie jest prawie tak zwarta i znacznie bardziej przejrzysta w użyciu, jeśli / jeszcze :)