ProgramlamaBackend Geliştirici

Perl'deki karmaşık veri yapılarının derin ve yüzeysel kopyalamaları arasındaki farkları açıklayınız. Kopyalar arasında istenmeyen bağlantıların olmamasını nasıl garanti edersiniz?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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.

Kandırmacalı Soru

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.

Konuya ilişkin bilinçsizlikten kaynaklanan gerçek hata örnekleri


Hikaye

Büyük XML dosyalarını ayrıştırma projesinde, her belge için şablon yapının bir hash'in şablonu alınıp referansla kopyalandı. Bir belgede yapılan değişiklikler diğerlerini etkilemeye başladı, "kaybolan" veya "bozuk" verilere yol açan gizemli hatalar ortaya çıktı.

Hikaye

Oturumları saklamak için kullanıcıların hash'leri ile diziler kullanıldı. Yeni kullanıcı listesi için dizi yeniden oluşturulurken, sadece referanslar kopyalandı, bu da önceki oturumdan kullanıcı verilerinin "sızmasına" neden oldu.

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.