Cosa c'è di sbagliato nel comando seguente
awk 'BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}'
Produzione :
awk: BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}
awk: ^ syntax error
Cosa c'è di sbagliato nel comando seguente
awk 'BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}'
Produzione :
awk: BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}
awk: ^ syntax error
Risposte:
Come molti altri linguaggi di programmazione, awk
distingue tra espressioni e dichiarazioni. In generale, le dichiarazioni sono azioni che vengono eseguite, mentre le espressioni sono calcoli che generano un valore.
L'operatore ternario in awk
, come la sua controparte in C da cui proviene, è esso stesso un'espressione (non un'affermazione) che si aspetta altre tre espressioni come expr1 ? expr2 : expr3
. print
è una dichiarazione. Non può essere usato dove è richiesta un'espressione, quindi l'errore di sintassi.
Ci hai provato awk 'BEGIN {a = 5;b=6; print (a==b)? "a==b" : "a!=b"}'
?
L'uso di un'istruzione in cui è richiesta un'espressione non ha alcun senso. Le dichiarazioni non restituiscono valori. Quindi, quando hai condition ? stmt1 : stmt2
, qual è il valore calcolato dall'operatore ternario? Se condition
è falso, dovrebbe essere il valore di stmt2
ma non è un valore, è un'azione.
x = if true; print "yes"; else; print "no"; end
(cond1) ? printf("str1") : printf("str2")
? Grazie spiegando le sottigliezze del ternario. EDIT: in effetti, usando la seguente brutta costruzione: str = (cond1) ? sprintf("str1") : sprintf("str2"); printf("%s", str)
funziona, ma a questo punto è quasi altrettanto compatto e molto più chiaro da usare se / altrimenti :)