三元运算符和打印


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

Answers:


25

像许多其他编程语言一样,awk区分表达式和语句。总的来说,语句是执行的动作,而表达式是产生值的计算。

awk与C中的三元运算符一样,它中的三元运算符本身就是一个表达式(不是语句),它期望其他三个表达式为expr1 ? expr2 : expr3print是一个声明。不能在需要表达式的地方使用它,因此语法错误。

你试过了awk 'BEGIN {a = 5;b=6; print (a==b)? "a==b" : "a!=b"}'吗?

使用需要调用表达式的语句没有任何意义。语句不返回值。那么,当您拥有时condition ? stmt1 : stmt2,三元运算符计算的值是多少?如果condition为false,则应为的值,stmt2但这不是值,而是操作。


还有其他一些语言的语句确实会返回值(想到红宝石),但这是该问题的完美答案。
glenn jackman '16

感谢您的澄清,@ glennjackman。我不知道Ruby,所以也许我不知道我在说什么,但是在阅读您的评论时我的第一个想法是猜测,这意味着在Ruby 语句中表达式
Celada

是的,您可以做这样无用的示例:x = if true; print "yes"; else; print "no"; end
glenn jackman

我猜这否定了像这样的建筑的可能性(cond1) ? printf("str1") : printf("str2")?感谢解释三元的微妙之处。编辑:事实上,使用以下丑陋的构造:str = (cond1) ? sprintf("str1") : sprintf("str2"); printf("%s", str)可行,但是在这一点上,它几乎一样紧凑,如果使用if / else,则更加清晰:)
isosceleswheel

如果您不想为不匹配的条件打印空白行,请考虑使用printf
tuxErrante
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.