Тернарный оператор и печать


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различает выражения и операторы. В общем, операторы - это действия, которые выполняются, а выражения - вычисления, которые приводят к значению.

Тернарный оператор in awk, как и его аналог в C, откуда он взят, сам является выражением (а не оператором), который ожидает три других выражения as expr1 ? expr2 : expr3. printэто утверждение. Его нельзя использовать там, где требуется выражение, поэтому синтаксическая ошибка.

Ты пробовал awk 'BEGIN {a = 5;b=6; print (a==b)? "a==b" : "a!=b"}'?

Использование оператора, для которого требуется выражение, не имеет никакого смысла. Заявления не возвращают значения. Итак, когда у вас есть condition ? stmt1 : stmt2, какое значение вычисляется тернарным оператором? Если conditionfalse, это должно быть значение, stmt2но это не значение, это действие.


Есть и другие языки , в которых заявления делают возвращаемые значения (рубин приходит на ум), но это идеальный ответ на вопрос.
Гленн Джекман

Спасибо за это разъяснение, @glennjackman. Я не знаю Ruby, поэтому, может быть, я не знаю, о чем говорю, но моей первой мыслью при прочтении вашего комментария было предположение, которое означает, что в выражениях Ruby вроде бы есть выражения .
Селада

да, вы можете делать такие вещи, как этот бесполезный пример: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, если вы не хотите печатать
пустые
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.