삼항 연산자 및 인쇄


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.