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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.