Perl'de, karmaşık veri yapılarını (örneğin, dizi dizileri, hash hashleri) kopyalarken, "yüzeysel kopyalama" (shallow copy) ve "derin kopyalama" (deep copy) arasındaki farkı anlamak önemlidir.
Yüzeysel kopyalama, yeni bir konteyner (örneğin bir dizi veya hash) oluşturur, ancak içinde bulunan elemanlar orijinal nesneleri referans alır. Bu durum, kopyada yapılan değişikliklerin orijinali etkilemesine neden olabilir.
Derin kopyalama, tamamen bağımsız bir yapı oluşturur ve tüm iç içe geçmiş elemanları özyinelemeli olarak kopyalar. Perl'de derin kopyalamak için genellikle Storable veya [Clone] modülü kullanılır:
use Storable 'dclone'; my $original = { a => [1, 2, { b => 3 }] }; my $copy = $original; # Yüzeysel kopya my $deep = dclone($original); # Derin kopya $copy->{a}[2]{b} = 42; # Hem $copy hem de $original'ı değiştirir! $deep->{a}[2]{b} = 99; # Sadece $deep'i değiştirir
Derin kopyalama, yapıların tamamen birbirinden izole olmasını garanti eder.
Bir diziyi değişken atamasıyla kopyalamanın, diziyi referansla kopyalamaktan ne farkı vardır? Bir diziyi doğru bir şekilde kopyalamak için, birinde yapılan değişikliklerin diğerini etkilememesi için ne yapılmalıdır?
Sıklıkla, sadece referansı atamanın yeterli olduğu söylenir: $copy = \@arr; — ancak bu yanlıştır, çünkü her iki değişken de aynı diziyi işaret eder. Bağımsız kopyalama için şunlar kullanılır:
my @copy = @original; # Artık diziler bağımsız
Eğer iç içe geçmiş yapıları kopyalamak gerekiyorsa — derin kopya gereklidir, örneğin Storable::dclone ile.
Hikaye
Hikaye
Hikaye
Toplu e-posta gönderimi için e-posta şablonlarının uygulanmasında, içerik nesneleri ile başlangıç yapıları atama ile kopyalandı, şablon metnindeki değişiklikler "yayılmaya" başladı ve alıcılara güncel olmayan mesajlar geldi.