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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.