Operator trójskładnikowy i drukuj

10

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
Mohammad Adil
źródło

Odpowiedzi:

25

Podobnie jak wiele innych języków programowania, awkrozróż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. printjest 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 conditionjest fałszem, powinna to być wartość, stmt2ale to nie jest wartość, to akcja.

Celada
źródło
Istnieją inne języki, w których oświadczenia robić wartości zwrotu (rubinowy przychodzi do głowy), ale jest to doskonała odpowiedź na pytanie.
glenn jackman
Dzięki za wyjaśnienie, @glennjackman. Nie znam Ruby, więc może nie wiem, o czym mówię, ale moją pierwszą myślą po przeczytaniu twojego komentarza było przypuszczenie, że oznacza to, że w wypowiedziach Ruby są to wyrażenia .
Celada,
tak, możesz robić rzeczy takie jak ten bezużyteczny przykład:x = if true; print "yes"; else; print "no"; end
glenn jackman
Myślę, że to neguje możliwość takiej konstrukcji (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 :)
isosceleswheel
rozważ użycie printf, jeśli nie chcesz drukować pustych linii dla niedopasowanych warunków
tuxErrante