ผู้ประกอบการที่สามและการพิมพ์


10

มีอะไรผิดปกติกับคำสั่งด้านล่าง

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

คำตอบ:


25

เช่นเดียวกับภาษาโปรแกรมอื่น ๆ อีกมากมายให้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แต่นั่นไม่ใช่ค่า แต่เป็นการกระทำ


มีภาษาอื่น ๆ ที่มีงบทำค่าผลตอบแทน (ทับทิมมาถึงใจ) แต่นี้เป็นคำตอบที่สมบูรณ์แบบสำหรับคำถามที่ว่า
เกล็นแจ็คแมน

ขอบคุณสำหรับคำอธิบายที่ @glennjackman ผมไม่ทราบว่าทับทิมดังนั้นบางทีผมไม่ทราบว่าสิ่งที่ผมพูดถึง แต่ความคิดแรกของฉันในการอ่านความคิดเห็นของคุณเดาว่านั่นหมายความว่าในรูบีงบชนิดของการมีการแสดงออก
Celada

ใช่คุณสามารถทำสิ่งต่าง ๆ เช่นตัวอย่างที่ไร้ประโยชน์นี้ได้x = if true; print "yes"; else; print "no"; end
เกล็นแจ็คแมน

ฉันเดาว่าสิ่งนี้ขัดแย้งกับความเป็นไปได้ของการก่อสร้าง(cond1) ? printf("str1") : printf("str2")ใช่ไหม ขอบคุณที่อธิบายรายละเอียดปลีกย่อยของไตรภาค แก้ไข: ในความเป็นจริงโดยใช้การก่อสร้างที่น่าเกลียดดังต่อไปนี้: ใช้str = (cond1) ? sprintf("str1") : sprintf("str2"); printf("%s", str)งานได้ แต่ ณ จุดนี้มันมีขนาดกะทัดรัดและชัดเจนยิ่งขึ้นหากใช้ / อื่น ๆ :)
isosceleswheel

พิจารณาใช้ printf หากคุณไม่ต้องการพิมพ์โมฆะบรรทัดสำหรับเงื่อนไขที่ไม่ตรงกัน
tuxErrante
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.