Perl의 defined 연산자는 값이 정의되어 있는지(즉, undef가 아닌지) 확인합니다. 다음과 같은 점을 구별하는 것이 중요합니다:
defined($x)는 $x가 undef가 아닐 때 true를 반환합니다(값이 무엇이든, 비어 있는 문자열이나 0인 경우에도 관계없이).defined($hash{$key})는 요소의 값이 정의되어 있는지 확인하지만, 키 자체가 존재하는지 보장하지는 않습니다.defined($array[$i])와 유사하게 요소가 정의되어 있을 수 있지만, 배열의 길이가 더 길거나 짧을 수 있습니다.exists를 사용합니다.예제:
my %h = (a => undef); if (exists $h{a}) { print "키 'a'가 존재합니다 "; } if (defined $h{a}) { print "키 'a'가 정의되어 있습니다 "; } else { print "키 'a'는 정의되지 않았습니다 "; }
결과:
키 'a'가 존재합니다
키 'a'는 정의되지 않았습니다
exists $hash{$key}와defined $hash{$key}의 차이점은 무엇이며 해시에 대한 정의된 검사에서 예상치 못한 결과를 얻는 경우는 언제입니까?
답변: defined $hash{$key}는 값을 확인하지만 키가 존재하지 않으면 정의되지 않은 값을 반환합니다. 키가 존재하지만 그 값이 undef이면 defined는 false를 반환합니다. 그러나 키가 없다면 또한 false를 반환합니다. 따라서 키의 존재를 확인할 때는 항상 exists를 사용하세요.
예제:
my %h = (foo => undef); if (defined $h{foo}) { ... } # false if (exists $h{foo}) { ... } # true
이야기
하나의 프로젝트에서 "준비 완료" 플래그를
defined($status{$id})로 확인하고, 값이 undef일 때 작업이 처리되지 않았다고 간주했습니다. 그러나 undef가 있는 키는 유효했으며 exists에 대한 검사가 없었습니다. 결과적으로 처리된 데이터의 일부가 반복적으로 실행되었습니다.
이야기
프로그래머가 파일에서 데이터를 가져오면서 문자열을
if (defined $line && $line ne '')로 비교했습니다. 문제: 때때로 $line은 '0'이라는 빈 문자열일 수 있습니다. 이런 문자열은 비어 있지 않지만 defined와의 비교(대신 ne '' 확인)를 사용하면 이러한 문자열이 손실되었습니다.
이야기
해시와 함께 작동하는 큰 Perl 스크립트에서 요소의 존재를 확인하는 유일한 방법이 defined였습니다. 그 결과, 값이 undef인 키에 대해 버그와 보고서의 누락된 데이터가 발생했습니다.