В 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; # Меняет both $copy and $original! $deep->{a}[2]{b} = 99; # Меняет только $deep
Глубокое копирование гарантирует, что структуры полностью изолированы друг от друга.
Чем отличается копирование массива с помощью присваивания переменной от копирования массива с помощью ссылки? Как правильно скопировать массив, чтобы потом изменения в одном не повлияли на другой?
Часто отвечают, что достаточно присвоить ссылку: $copy = \@arr; — однако это неверно, так как обе переменные указывают на один и тот же массив. Для независимого копирования используют:
my @copy = @original; # Теперь массивы независимы
Если требуется копировать вложенные структуры — необходим deep copy, например, через Storable::dclone.
История
История
История
При реализации шаблонов e-mail'ов для массовой рассылки исходные структуры с вложенными объектами копировали присваиванием, изменения в тексте шаблона "протекали" между рассылками, приходили неактуальные сообщения адресатам.