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ó 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:
Giống như nhiều ngôn ngữ lập trình khác, awk
phâ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
. print
là 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 condition
là sai, nó phải là giá trị của stmt2
nhưng đó không phải là giá trị, đó là một hành động.
x = if true; print "yes"; else; print "no"; end
(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 :)