三項演算子と印刷


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のそれと同じように、それ自体が式(ステートメントではない)であり、他の3つの式をとして期待しexpr1 ? expr2 : expr3ます。printステートメントです。式が要求される場所では使用できないため、構文エラーになります。

試しましたawk 'BEGIN {a = 5;b=6; print (a==b)? "a==b" : "a!=b"}'か?

式が呼び出されるステートメントを使用しても意味がありません。ステートメントは値を返しません。では、condition ? stmt1 : stmt2がある場合、三項演算子によって計算される値は何ですか?conditionがfalseの場合、それはの値である必要がありますがstmt2、それは値ではなく、アクションです。


ステートメント値を返す他の言語があります(ルビーが思い浮かびます)が、これは質問に対する完全な答えです。
グレン・ジャックマン

その説明をありがとう、@ glennjackman。Rubyがわからないので、何について話しているのかわからないかもしれませんが、コメントを読んだときに最初に思ったのは、Ruby ステートメントで一種の式だということです。
Celada

はい、あなたはこの無用の例のようなものを行うことができます:x = if true; print "yes"; else; print "no"; end
グレンはジャックマン

これは次のような構造の可能性を否定すると思い(cond1) ? printf("str1") : printf("str2")ますか?三元の微妙さを説明してくれてありがとう。編集:実際には、次の醜い構造を使用:str = (cond1) ? sprintf("str1") : sprintf("str2"); printf("%s", str)動作しますが、現時点では、if / elseを使用するのとほぼ同じくらいコンパクトではるかに明確です:)
isosceleswheel

一致
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.