developer tip

존재와 정의의 차이점은 무엇입니까?

copycodes 2020. 12. 11. 08:23
반응형

존재와 정의의 차이점은 무엇입니까?


차이점은 무엇입니까

if (defined $hash{$key}) { }

if (exists $hash{$key}) { }

어떤 것을 사용해야하는지 언제 알 수 있습니까?


이것은 defined에 대한 perldoc 항목에 잘 설명되어 exists있습니다. 다음은 간단한 요약입니다.

defined $hash{key}주어진 키에 대한 값이 정의되었는지 여부를 알려줍니다 (예 : 아님 undef). 정의되지 않은 값과 같은 부울 맥락에서 거짓 값을 구분하는 데 사용 0하고 ''.

exists $hash{key}%hash주어진 키가 포함되어 있는지 여부를 알려줍니다 . 정의되지 않은 값과 존재하지 않는 값을 구별하는 데 사용합니다.

예를 들어 보면 가장 쉽게 알 수 있습니다. 이 해시가 주어지면 :

my %hash = (a => 1, b => 0, c => undef);

검색, 정의 및 존재에 대한 결과는 다음과 같습니다.

# key  value  defined  exists
a          1        1       1
b          0        1       1
c      undef        0       1
d      undef        0       0

실제로 사람들은 종종 if ($hash{key}) {...}(대부분의 경우) 참 값만이 의미 있고 가능하기 때문에 글을 씁니다 . 거짓 값이 유효하면 테스트에 추가 해야합니다defined() . exists()훨씬 덜 자주 사용됩니다. 가장 일반적인 경우는 아마도 해시를 세트로 사용할 때입니다. 예 :

my %set = map { $_ => undef } 'a' .. 'z';

undef설정 값에 사용 하면 몇 가지 장점이 있습니다.

  1. 의도를 더 정확하게 나타냅니다 (값이 아니라 키만 의미 있음).
  2. 모든 undef값은 단일 할당을 공유합니다 (메모리 절약).
  3. exists() 테스트가 약간 더 빠릅니다 (Perl이 값을 검색 할 필요가없고 값이 하나만 있는지 확인하기 때문입니다).

또한 exists()세트 멤버십을 확인하기 위해 사용해야하는 단점이있어 더 많은 타이핑이 필요하고 잊어 버리면 잘못된 작업을 수행합니다.

exists유용한 또 다른 장소 는 값을 검색하기 전에 잠긴 해시를 조사하는 것입니다 (예외를 트리거 함).


defined변수의 값을 확인하고 exists이전에 선언 / 초기화되었는지 확인합니다. 존재한다면 단순하고 단순합니다.

예 :

$hash{$key} = undef;
# various return values:
exists  $hash{$key};  # true
defined $hash{$key};  # false
$hash{$key};          # false

$hash{$key} = 0;
# various return values:
exists  $hash{$key};  # true
defined $hash{$key};  # true
$hash{$key};          # false
exists $hash{$foo};   # false

Perl 문서 :

해시 요소에 사용되는 경우 defined 는 키가 해시에 있는지 여부가 아니라 값이 정의되었는지 여부를 알려줍니다. 사용은 존재 후자의 목적을 위해.


에 대한 perldoc에exists 명시된대로 :

해시의 요소를 지정하는 표현식이 주어지면 해당 값이 정의되지 않은 경우에도 해시의 지정된 요소가 초기화 된 적이 있으면 true를 반환합니다.

해시 또는 배열 요소는 존재하는 경우에만 정의되고 정의 된 경우에만 참일 수 있지만 그 반대가 반드시 참을 유지하는 것은 아닙니다.

즉, 해시는 정의되지 않은 요소를 포함 할 수 defined있으며이 경우 -check는을 반환 false하고 exists-check는를 반환 true합니다.

따라서 exists주어진 항목이 해시에 존재 defined하는지 알고 싶다면, 주어진 항목이 존재하고 정의되어 있는지 알고 싶다면를 사용해야합니다.


이 예는 차이점을 보여줍니다. 일반적으로 모든 구조에 대해 정의 된 작업 및 존재는 해시와 관련이 있습니다.

my %hash=("1"=>undef);
print "exists:".exists($hash{"1"})."\n";
print "defined:".defined($hash{"1"})."\n";

그 차이는 작고 분명하지 않으므로 사람들이 그것을 망칠 것이라고 기대하십시오.

참고 URL : https://stackoverflow.com/questions/6534573/whats-the-difference-between-exists-and-defined

반응형