2014-03-12 4 views
0
my $line = "hello"; 
print ($line == undef); 

$ line이 정의되지 않았기 때문에 검사는 거짓이어야합니다 (첫 번째 줄에서 정의했습니다). 이 코드 조각이 '1'을 인쇄하는 이유는 무엇입니까?이 문자열 undef가 true를 반환하는 이유는 무엇입니까?

+0

중복 가능성 [== 차이 = 및 EQ (http://stackoverflow.com/questions/18396049/difference -between-and-eq) – mob

답변

4

당신이 말한 정확히하고있어. ($line == undef) 부울 문이기 때문에

print ($line == undef); 

당신은 부울 값을 인쇄하고 있습니다.

==이고, 수치는입니다. $line은 텍스트이므로 0 값을가집니다. 숫자도 undef입니다. 따라서 ($line == undef)이 참입니다.

당신은 항상 당신의 프로그램의 상단에 다음 넣어해야합니다

use strict; 
use warnings; 

사람들이 넣어 다른 프라 그마있다, 그러나 이들은 가장 중요한 두 가지입니다. 그들은 당신의 오류의 90 %를 발견 할 것입니다. 이 프로그램을 시도해보십시오

use strict; 
use warnings; 
my $line = "hello"; 
print ($line == undef) 

당신은 얻을 것이다 : 물론

Use of uninitialized value in numeric eq (==) at ./test.pl line 6. 
Argument "hello" isn't numeric in numeric eq (==) at ./test.pl line 6. 

내가 초기화되지 않은 값이! undef을 사용하고 있습니다. 그리고 물론 hello은 숫자가 아닙니다.

나는 당신이 원하는 것을 완전히 모릅니다. hello이 정의되어 있지 않으면 인쇄 하시겠습니까? 그 부울 성명서의 가치를 보려고합니까?

\n은 결국 print이 줄 끝까지 오지 않습니다. 너 저걸 원하니? print는 잊어 \n 에러 경향이있을 수 있기 때문에, I는 say을 선호 :

use strict; 
use warnings; 
use feature qw(say); # Say is like print but includes the ending `\n` 

my $line = "hello"; 
say (not defined $line); # Will print null (false) because the line is defined 
say (defined $line);  # Will print "1" (true). 
say ($line ne undef);  # Will print '1' (true), but will give you a warning. 
say $line if defined line; # Will print out $line if $line is defined 
+0

와우는 매우 상세했습니다. 고마워. – santi

4

항상

use strict; use warnings; 

또는

을 넣어
use Modern::Perl; 
당신은 몇 가지 오류를 볼 수

:

print "variable defined" if defined $variable; 
:

Use of uninitialized value in numeric eq (==) at /tmp/sssl.pl line 3. 
Argument "hello" isn't numeric in numeric eq (==) at /tmp/sssl.pl line 3. 

이 변수가 정의되어있는 경우, 사용을 테스트하려면 다른 문자열에 대한 문자열을 테스트하려면

는 사용

if ($string eq $another_string) { ... } 
+0

아! 감사합니다. 자바에서 null을 사용할 때 undef를 사용할 수 있다고 생각했습니다. – santi