프로그래밍백엔드 개발자

Perl에서 복잡한 데이터 구조를 깊은 복사와 얕은 복사로 복사하는 것의 차이를 설명하십시오. 복사본 간에 원치 않는 연결이 없도록 보장하는 방법은 무엇입니까?

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

답변

Perl에서 복잡한 데이터 구조(예: 배열의 배열, 해시의 해시)를 복사할 때 "얕은 복사"(shallow copy)와 "깊은 복사"(deep copy)의 차이를 이해하는 것이 중요합니다.

얕은 복사는 새로운 컨테이너(예: 배열 또는 해시)를 생성하지만 그 안의 요소는 원본과 동일한 객체를 참조합니다. 이로 인해 복사본에서 데이터가 변경되면 원본에도 영향을 미치는 예상치 못한 행동이 발생할 수 있습니다.

깊은 복사는 모든 중첩 요소를 재귀적으로 복사하여 완전히 독립적인 구조를 생성합니다. Perl에서 깊은 복사를 위해 종종 Storable 또는 [Clone] 모듈이 사용됩니다:

use Storable 'dclone'; my $original = { a => [1, 2, { b => 3 }] }; my $copy = $original; # 얕은 복사 my $deep = dclone($original); # 깊은 복사 $copy->{a}[2]{b} = 42; # $copy와 $original 모두 변경됨! $deep->{a}[2]{b} = 99; # $deep만 변경됨

깊은 복사는 구조가 서로 완전히 격리되어 있음을 보장합니다.

트릭 질문

변수를 이용한 배열 복사와 참조를 이용한 배열 복사의 차이점은 무엇입니까? 한 배열의 변경이 다른 배열에 영향을 미치지 않도록 올바르게 복사하는 방법은 무엇입니까?

종종 단순히 참조를 할당하면 된다고 답하지만: $copy = \@arr; — 이는 잘못된 답변입니다. 두 변수 모두 동일한 배열을 가리키기 때문입니다. 독립적으로 복사하려면:

my @copy = @original; # 이제 배열은 독립적입니다

중첩 구조를 복사해야 하는 경우 깊은 복사가 필요합니다. 예를 들어 Storable::dclone를 통해서입니다.

주제에 대한 모르는 것 때문에 발생한 실제 오류의 예


이야기

대규모 XML 파일을 구문 분석하는 프로젝트에서 각 문서에 대해 템플릿 해시와 템플릿 구조를 링크로 복사했습니다. 하나의 문서에서의 변경이 다른 문서에 영향을 미쳐 미스터리한 버그가 발생하여 데이터가 "사라지"거나 "어그러지는" 현상이 발생했습니다.

이야기

세션 저장을 위한 인증에서는 사용자 해시 배열을 사용했습니다. 새로운 사용자 목록을 위한 배열을 재생성할 때 링크만 복사하여 이전 세션의 사용자 데이터가 "유출"되는 문제가 발생했습니다.

이야기

대량 이메일 발송을 위한 이메일 템플릿 구현 시, 중첩 객체가 있는 원본 구조를 할당으로 복사해 템플릿 텍스트의 변경이 발송 간에 "누수"되어 수신자에게 오래된 메시지가 전달되는 문제가 발생했습니다.