Operator ternary dan cetak

10

Apa yang salah dengan perintah di bawah ini

awk 'BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}'

Keluaran:

awk: BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}
awk:                           ^ syntax error
Mohammad Adil
sumber

Jawaban:

25

Seperti banyak bahasa pemrograman lainnya, awkmembedakan antara ekspresi dan pernyataan. Secara umum, pernyataan adalah tindakan yang dilakukan, sedangkan ekspresi adalah perhitungan yang menghasilkan nilai.

Operator ternary di awk, seperti mitranya dalam C dari mana asalnya, itu sendiri merupakan ekspresi (bukan pernyataan) yang mengharapkan tiga ekspresi lainnya sebagai expr1 ? expr2 : expr3. printadalah sebuah pernyataan. Itu tidak dapat digunakan di mana ekspresi dipanggil, karenanya kesalahan sintaksis.

Sudahkah Anda mencoba awk 'BEGIN {a = 5;b=6; print (a==b)? "a==b" : "a!=b"}'?

Menggunakan pernyataan di mana ekspresi dipanggil untuk tidak masuk akal. Pernyataan tidak mengembalikan nilai. Jadi ketika Anda memilikinya condition ? stmt1 : stmt2, berapa nilai yang dihitung oleh operator ternary? Jika conditionsalah, itu harus nilai stmt2tetapi itu bukan nilai, itu tindakan.

Celada
sumber
Ada bahasa lain di mana pernyataan memang mengembalikan nilai (ruby datang ke pikiran), tetapi ini adalah jawaban yang sempurna untuk pertanyaan itu.
glenn jackman
Terima kasih atas klarifikasi itu, @glennjackman. Aku tidak tahu Ruby jadi mungkin saya tidak tahu apa yang saya bicarakan tapi pikiran pertama saya membaca komentar Anda adalah bahwa menebak bahwa berarti bahwa dalam Ruby pernyataan jenis yang ekspresi .
Celada
ya, Anda dapat melakukan hal-hal seperti contoh tidak berguna ini:x = if true; print "yes"; else; print "no"; end
glenn jackman
Saya kira ini meniadakan kemungkinan konstruksi seperti (cond1) ? printf("str1") : printf("str2")? Terima kasih menjelaskan seluk beluk terner. EDIT: pada kenyataannya, menggunakan konstruksi jelek berikut: str = (cond1) ? sprintf("str1") : sprintf("str2"); printf("%s", str)berfungsi, tetapi pada titik ini hampir sekompak dan jauh lebih jelas untuk digunakan jika / selain itu :)
isosceleswheel
pertimbangkan untuk menggunakan printf jika Anda tidak ingin mencetak garis kosong untuk kondisi yang tidak cocok
tuxErrante