삼항 연산자 및 인쇄


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표현식과 명령문을 구별합니다. 전반적으로, 명령문은 수행되는 조치이며 표현식은 값을 산출하는 계산입니다.

의 삼항 연산자는 awkC의 대응 연산자와 마찬가지로 세 가지 다른 식을 기대하는 식 (구문이 아님)입니다 expr1 ? expr2 : expr3. print진술입니다. 표현식이 호출되는 곳에서는 사용할 수 없으므로 구문 오류가 발생합니다.

시도 했습니까 awk 'BEGIN {a = 5;b=6; print (a==b)? "a==b" : "a!=b"}'?

식이 필요한 문을 사용하는 것은 의미가 없습니다. 문은 값을 반환하지 않습니다. 그렇다면 condition ? stmt1 : stmt2, 삼항 연산자로 계산 한 값은 무엇입니까? conditionFalse 인 경우 값이어야 stmt2하지만 값이 아니라 동작입니다.


문 이 값을 반환 하는 다른 언어가 있지만 (루비가 떠오름) 이것은 질문에 대한 완벽한 답변입니다.
— glenn jackman

설명을 해주셔서 감사합니다, @glennjackman. 그래서 어쩌면 내가 무슨 말인지 모르지만 당신의 코멘트를 읽어 내 첫번째 생각은 루비의 수단 있다는 것을 추측했다 루비를 모르는 문장 가지 입니다 표현 .
— Celada

그래, 당신이 쓸모없는 예를 들어 같은 물건을 할 수 있습니다 :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와 사용을 고려
— tuxErrante
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.