프로그래밍Perl 백엔드 개발자, 데이터 엔지니어 (Perl), Perl 풀스택

정의된 연산자와 함께 작업할 때의 잠재적인 문제는 무엇이며 Perl의 다양한 변수 유형에서 값의 존재와 비어 있음을 올바르게 확인하는 방법은 무엇입니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

Perl의 defined 연산자는 값이 정의되어 있는지(즉, undef가 아닌지) 확인합니다. 다음과 같은 점을 구별하는 것이 중요합니다:

  • 스칼라의 경우: defined($x)$xundef가 아닐 때 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인 키에 대해 버그와 보고서의 누락된 데이터가 발생했습니다.