มีอะไรผิดปกติกับคำสั่งด้านล่าง
awk 'BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}'
ผลผลิต:
awk: BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}
awk: ^ syntax error
มีอะไรผิดปกติกับคำสั่งด้านล่าง
awk 'BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}'
ผลผลิต:
awk: BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}
awk: ^ syntax error
คำตอบ:
เช่นเดียวกับภาษาโปรแกรมอื่น ๆ อีกมากมายให้awk
แยกความแตกต่างระหว่างนิพจน์และข้อความสั่ง โดยและขนาดใหญ่คำสั่งคือการกระทำที่ดำเนินการในขณะที่นิพจน์เป็นการคำนวณที่ส่งผลให้เกิดค่า
ผู้ประกอบการ ternary ในawk
เช่นคู่ใน C ที่มาจากเป็นตัวเองการแสดงออก (ไม่ใช่คำสั่ง) ที่คาดว่าสามแสดงออกอื่น ๆ expr1 ? expr2 : expr3
เช่น print
เป็นคำสั่ง ไม่สามารถใช้งานได้เมื่อมีการเรียกใช้นิพจน์ดังนั้นข้อผิดพลาดทางไวยากรณ์
คุณเคยลองawk 'BEGIN {a = 5;b=6; print (a==b)? "a==b" : "a!=b"}'
ไหม
การใช้ข้อความที่นิพจน์ถูกเรียกใช้ไม่สามารถทำให้เกิดความรู้สึกใด ๆ ใบแจ้งยอดจะไม่ส่งคืนค่า ดังนั้นเมื่อคุณมีcondition ? stmt1 : stmt2
ค่าที่คำนวณโดยผู้ประกอบการที่สามคืออะไร? หากcondition
เป็นเท็จควรเป็นมูลค่าstmt2
แต่นั่นไม่ใช่ค่า แต่เป็นการกระทำ
x = if true; print "yes"; else; print "no"; end
(cond1) ? printf("str1") : printf("str2")
ใช่ไหม ขอบคุณที่อธิบายรายละเอียดปลีกย่อยของไตรภาค แก้ไข: ในความเป็นจริงโดยใช้การก่อสร้างที่น่าเกลียดดังต่อไปนี้: ใช้str = (cond1) ? sprintf("str1") : sprintf("str2"); printf("%s", str)
งานได้ แต่ ณ จุดนี้มันมีขนาดกะทัดรัดและชัดเจนยิ่งขึ้นหากใช้ / อื่น ๆ :)