Perl에서는 기본적으로 참조 구조(예: 배열의 배열 또는 해시의 해시)의 복사가 얕게 수행됩니다: 링크만 복사되고 중첩된 내용은 복사되지 않습니다. 역사적으로 이는 종종 예상치 못한 효과를 초래했습니다. 한 복사본의 내부 구조를 변경하면 다른 복사본에도 반영됩니다. 해결책: 독립된 중첩 요소가 포함된 독립적인 구조를 생성하기 위해 깊은 복사를 위한 전문화된 메서드와 모듈을 사용해야 합니다.
코드 예시 (Storable 사용):
use Storable 'dclone'; my $original = { a => [1, 2, { x => 10 }] }; my $copy = dclone($original); $copy->{a}[2]{x} = 20; print $original->{a}[2]{x}; # 10
주요 특징:
“=” 연산자 ($copy = $ref)가 깊은 복사에 작동합니까?
아니오, “=” 연산자는 링크만 복사합니다. 이렇게 할당한 후에는 $copy의 모든 변경 사항이 $ref에 반영됩니다.
Data::Dumper를 구조의 깊은 복사에 사용할 수 있습니까?
Data::Dumper는 문자열로 직렬화하는 디버깅 도구이며, 메모리에서 데이터 구조를 복원하기 위해 설계되지 않았습니다. 역변환을 위해서는 eval이 필요하므로 안전상의 이유와 성능 문제로 권장되지 않습니다.
dclone이 항상 객체(축복된 참조)에 대해 올바르게 작동합니까?
Storable::dclone은 객체를 복제하지만, 클래스가 직렬화 메서드를 오버로드하지 않거나 비표준 객체(예: 파일 디스크립터 또는 외부 자원에 대한 강한 참조)를 포함하지 않을 때만 복제합니다. 복잡한 객체의 경우 STORABLE_freeze 및 STORABLE_thaw 메서드를 구현해야 합니다.
배열의 배열이 “=” 연산자로 복제되며, 중첩 구조 중 하나에 변경이 가해지면 모든 복사본에서 동일한 변경이 나타납니다.
장점:
단점:
Storable::dclone 또는 Clone::PP를 사용하여 모든 중첩 구조가 독립적입니다.
장점:
단점: