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