2011-08-18 4 views
3

이 값이 0 인 경우에도 특정 해시 키에 이미 값이 할당되어 있는지 테스트하는 올바른 방법이 있습니까? 나는이 같은 문으로 일하고있다 :Perl : 해시 키에 값 (심지어 0)이 할당되었는지 테스트하는 방법

%hash=(); 
$hash{a}=1; 
$hash{b}=0; 
if($hash{$key}) { do something } 

하지만이 네벤 만져 된 키에 대한 동일한 결과를 제공합니다 (예 : 모두 $ 해시 {B}와 $ 해시 값 0을 할당 된 것들 {c} 'false'로 평가). 이 둘의 차이를 말하는 방법이 있습니까?

답변

9

사용에게 defined 연산자를 뭔가가 %hash$key가있는 경우 확인 undef

if (defined $hash{ $key }) { 
    //do stuff 
} 

사용 exists 연산자 아닌 값을 가지고 있는지 확인하는 에 작성되었습니다

defined 검사 값 $key 있는지 확인하기 위해 사용된다 undefexists 이외의 경우 표시되는 것을 차이 값에도 불구 해시 키이다.

+0

이 솔루션을 이용해 주셔서 감사합니다. 가장 도움이됩니다. – user900889

+0

@ user900889 - updated – zellio

+1

나는 "EVER"라고 말하지 않을 것입니다; 삭제하면 더 이상 존재하지 않습니다. 그것이 존재하는지 여부에 관계없이 값이 있다는 테스트가 존재합니다. – ysth

4

perldoc -f definedperldoc -f exists를 참조하십시오

my %hash = (foo => 0, bar => undef); 

print defined $hash{foo}; # true 
print defined $hash{bar}; # false 
print exists $hash{bar}; # true 
print exists $hash{baz}; # false 

delete $hash{bar}; 
print exists $hash{bar}; # false 
+2

"존재"키입니다. "정의 됨"은 값을 나타냅니다. – aartist

+0

@ aartist : 나는 당신이 무슨 뜻인지 전혀 모르겠다. 설명 할 수 있니? – ysth

+1

zoul : 예를 들어 say를 사용하려고한다면 실제로는 use 5.010; 또는 다른 것을 실행 가능하게해야합니다. 또한, 그것들은 perl 주석이 아닙니다. – ysth

-2

당신은 키가 실제로 해시에 존재하는지 확인하기 위해 defined()를 사용할 수 있습니다

if (defined($hash{$key})) { do('something'); }; 
+0

'do ('something');은 문자 그대로 (실제로는 "무언가"를 파일 이름으로 사용하고 해당 파일의 내용을 Perl로 실행합니다) 의미가 아닙니다. –

+1

해시에 키가 있는지 여부를 확인하기 위해 defined()를 절대 사용할 수 없습니다. 키와 연관된 값이 정의되었는지 여부를 테스트하기 위해 정의를 사용할 수 있습니다. hash()에 키가 있는지 확인하려면 exists()를 사용합니다. – tadmc

관련 문제