Термінальний оператор і друк


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розрізняє вирази та заяви. За великим рахунком, оператори - це дії, які виконуються, тоді як вирази - це обчислення, які призводять до значення.

Потрійний оператор в awk, як і його аналог на C, звідки він походить, сам по собі є виразом (а не твердженням), який очікує, що три інші вирази як expr1 ? expr2 : expr3. printє заявою. Його не можна використовувати там, де викликається вираз, отже, синтаксична помилка.

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

Використання оператора, у якому викликається вираз, не може мати сенсу. Виписки не повертають значення. Отже, коли у вас є condition ? stmt1 : stmt2, яке значення обчислює потрійний оператор? Якщо conditionfalse, це має бути значення, stmt2але це не значення, це дія.


Є й інші мови , в яких заяви роблять повернені значення (рубін приходить на розум), але це ідеальний відповідь на питання.
Глен Джекман

Дякую за пояснення, @glennjackman. Я не знаю Рубі, тож, можливо, я не знаю, про що я говорю, але моя перша думка, читаючи ваш коментар, була такою здогадкою, що означає, що у висловлюваннях Рубі вид є виразом .
Селада

так, ви можете робити такі речі, як цей марний приклад:x = if true; print "yes"; else; print "no"; end
glenn jackman

Я думаю, що це заперечує можливість такого будівництва (cond1) ? printf("str1") : printf("str2")? Спасибі поясненням тонкощів потрійного. EDIT: насправді, використовуючи таку потворну конструкцію: str = (cond1) ? sprintf("str1") : sprintf("str2"); printf("%s", str)працює, але на даний момент її майже так само компактно і набагато зрозуміліше використовувати, якщо / ще :)
isosceleswheel

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.