2011-12-27 2 views
-4

OK :왜이 메시지를 출력하지 않고 종료하지 않습니까?

my $login='anybody'; 
exit if $login ne 'root'; 

NOT OK : 다음 인쇄 "error"를하지 않는 이유는 무엇입니까?

my $login='anybody'; 
(print "error" && exit) if $login ne 'root'; 

if (condition) {action}에 대해 알고 있습니다. 나는 현재의 문제에 대해서 알고 싶다.

+4

"NOT OK"는 무엇을 의미합니까? 예상치 못한 일을합니까? 그것은 경고/오류를 던집니까? – bobbymcr

+0

사실, Brian, Perl에서 그렇습니다. 우리는 예를 들어'open (stuff) || bash 스크립팅과 마찬가지로 모든 종류의 오류 검사에 "die"error "를 사용합니다. – Dan

+0

@ 단 - 댓글을 삭제하고 완전한 설명을 위해 답변으로 이동했습니다. 이것은 논리적 비교입니다. * 어떤 일들이 실행되는지 여부를 제어하지만, 여전히 OP 코드에 쓰이는 방법은 "And then then this"가 아닙니다. –

답변

10

당신이 쓴 것은 말한다 때문에 :

는 "문자열 '오류'및 종료 명령의 결과의 평가를 인쇄"

당신이 실제로 쓸 수 :

((print "error\n") && exit) if $login ne 'root'; 

하지만 제발하지 마십시오. :)

+3

+1 "please do not" –

+0

나는 그것이 실제로 너무 혀와 뺨이라고 생각하고 그것을 제거했다. 나는 뒤로 말았다 : –

+0

당신은 "혀를 IN 뺨"의미. – AmbroseChapel

7

"오류"가 표시되지 않는다고 생각합니까? 맞습니까? 이는 표현식 print "error" && exitprint ("error" && exit)으로 해석되기 때문입니다. 대신이 시도 :

do { print "error"; exit } if $login ne 'root'; 
+0

좋은 추측 -하지만 추측해서는 안됩니다. 문제는보다 명확하게 기술되어야한다. IMHO ... – paulsm4

+0

하지만'perldoc perlop'은 명명 된 단항 연산자가'&&'보다 우선 순위가 높으므로'(print "error") && exit'로 해석해야합니다. – Dan

+2

@Dan -'print'는 명명 된 단항 연산자가 아닙니다.그것은 함수입니다. –

9

세 가지 문제점이 있습니다.


첫 번째 문제는 우선 순위입니다.

print "error" && exit if ...; 

print("error" && exit) if ...; 

가능한 수정과 동일하다 :

(print "error") && exit if ...; 
print("error") && exit if ...; 
print "error" and exit if ...; 

두 번째 문제는 exitprint의 결과를 조건이라고하고, 그 적절한 아니다. print이 오류를 반환하더라도 종료하려고합니다.

가능한 수정 :

(print "error"), exit if ...; 
print("error"), exit if ...; 

세 번째 문제는이 오류를보고 정말 빈약 한 방법이다. 오류는 STDERR에 인쇄되어야하며 0이 아닌 종료 코드를 사용해야합니다. die은 여기에서 훌륭하게 작동합니다.

die "error" if ...; 
+1

+1 두 번째 문제를 강조하기 위해 루트에서 문제를 해결합니다 – Zaid

+0

Zaid는 이제 세 번째 문제를 언급했습니다. – ikegami

관련 문제