Toán tử ternary và in


10

Có gì sai với lệnh dưới đây

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

Đầu ra:

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

Câu trả lời:


25

Giống như nhiều ngôn ngữ lập trình khác, awkphân biệt giữa biểu thức và câu lệnh. Nhìn chung, các câu lệnh là các hành động được thực hiện, trong khi các biểu thức là các tính toán dẫn đến một giá trị.

Toán tử ternary trong awk, giống như đối tác của nó trong C xuất phát, chính nó là một biểu thức (không phải là một câu lệnh) mong đợi ba biểu thức khác như expr1 ? expr2 : expr3. printlà một tuyên bố. Nó không thể được sử dụng khi một biểu thức được gọi cho, do đó lỗi cú pháp.

Bạn đã thử awk 'BEGIN {a = 5;b=6; print (a==b)? "a==b" : "a!=b"}'chưa

Sử dụng một câu lệnh trong đó một biểu thức được gọi là không thể có ý nghĩa. Báo cáo không trả về giá trị. Vì vậy, khi bạn có condition ? stmt1 : stmt2, giá trị được tính toán bởi toán tử ternary là gì? Nếu conditionlà sai, nó phải là giá trị của stmt2nhưng đó không phải là giá trị, đó là một hành động.


Có những ngôn ngữ khác, nơi báo cáo làm giá trị trả về (ruby nói đến cái tâm), nhưng đây là một câu trả lời hoàn hảo cho câu hỏi này.
glenn jackman

Cảm ơn đã làm rõ, @glennjackman. Tôi không biết Ruby nên có lẽ tôi không biết tôi đang nói về điều gì nhưng suy nghĩ đầu tiên của tôi khi đọc bình luận của bạn là phỏng đoán đó có nghĩa là trong các câu phát biểu của Ruby biểu thức .
Celada

vâng, bạn có thể làm những thứ như ví dụ vô dụng này:x = if true; print "yes"; else; print "no"; end
glenn jackman

Tôi đoán điều này phủ nhận khả năng của một công trình như thế (cond1) ? printf("str1") : printf("str2")nào? Cảm ơn giải thích sự tinh tế của chim nhạn. EDIT: trên thực tế, sử dụng cấu trúc xấu xí sau: str = (cond1) ? sprintf("str1") : sprintf("str2"); printf("%s", str)hoạt động, nhưng tại thời điểm này, nó gần như nhỏ gọn và rõ ràng hơn nhiều để sử dụng if / other :)
isosceleswheel

xem xét sử dụng printf nếu bạn không muốn in các dòng trống cho các điều kiện chưa từng có
tuxErrante
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.