Perl'de varsayılan olarak, referans yapıların kopyalanması (örneğin, diziler dizileri veya hash'ler hash'leri) yüzeysel olarak gerçekleştirilir: yalnızca referansların kendileri kopyalanır, içindeki içerikler değil. Tarihsel olarak bu sıklıkla beklenmedik etkilere yol açmıştır; bir kopyadaki iç yapıdaki değişiklikler diğerlerinde de yansır. Çözüm: bağımsız iç elemanları olan bağımsız bir yapı oluşturmak için özel kopyalama yöntemleri ve modüller kullanmaktır.
Kod örneği (Storable kullanarak):
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
Anahtar özellikler:
Derin kopyalama için “=” operatörü ($copy = $ref) çalışır mı?
Hayır, “=” operatörü yalnızca referansı kopyalar. Böyle bir atamadan sonra, $copy'deki herhangi bir değişiklik $ref'de de görünür.
Veri yapısını derin kopyalamak için Data::Dumper fonksiyonu kullanılabilir mi?
Data::Dumper, hata ayıklama ve dizeye seri hale getirme aracı olarak tasarlanmıştır, bellek içindeki veri yapısını geri yüklemek için değildir. Geri dönüşüm için eval gerekir, bu tehlikelidir ve güvenlik ile performans nedenleriyle önerilmez.
dclone her zaman nesnelerle (blessed references) doğru çalışır mı?
Storable::dclone, nesneleri kopyalar, ancak yalnızca sınıf seri hale getirme yöntemlerini aşırı yüklemiyorsa veya standart dışı nesneler (örneğin, dosya tanımlayıcıları veya dış kaynağa güçlü referanslar) içermiyorsa. Karmaşık nesneler için STORABLE_freeze ve STORABLE_thaw yöntemlerini uygulamak gerekebilir.
Diziler dizileri, = operatörü ile kopyalanır, iç yapılarından birine değişiklik yapılır — tüm kopyalarda aynı değişiklikler görünür.
Artılar:
Eksiler:
Storable::dclone veya Clone::PP kullanılır, tüm iç yapılar bağımsızdır.
Artılar:
Eksiler: