Operatore ternario e stampa


10

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:


25

Come molti altri linguaggi di programmazione, awkdistingue 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 stmt2ma non è un valore, è un'azione.


Ci sono altre lingue in cui le dichiarazioni fanno valori di ritorno (rubino viene in mente), ma questa è una risposta perfetta per la domanda.
Glenn Jackman,

Grazie per questo chiarimento, @glennjackman. Non conosco Ruby, quindi forse non so di cosa sto parlando, ma il mio primo pensiero a leggere il tuo commento è stata quella ipotesi che significa che nelle dichiarazioni di Ruby sono espressioni .
Celada,

sì, puoi fare cose come questo esempio inutile:x = if true; print "yes"; else; print "no"; end
Glenn Jackman,

Immagino che questo annulli la possibilità di una costruzione come (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 :)
isosceleswheel

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.