ProgramlamaPerl geliştirici / Perl projeleri için baş geliştirme uzmanı

Perl'de `my`, `local` ve `our` kullanıldığında, leksik ve dinamik kapsamın nasıl çalıştığını açıklayın ve bu farkların yanlış anlaşılmasının neden olduğu sorunlara örnekler verin.

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

Cevap

Perl'de değişkenlerin leksik veya dinamik kapsamı olabilir.

  • my, leksik kapsam ile bir değişken oluşturur: Değişken yalnızca tanımlandığı blok içinde görünür.
  • local, dinamik kapsam ile bir global (paket) değişkenin değerini geçici olarak yeniden tanımlar: Yeni değer, bloktan çıkana kadar çağrılan tüm fonksiyonlarda görünür.
  • our, global (paket) bir değişken tanımlar, ancak yalnızca mevcut leksik blok içinde görünür.

Örnek:

our $x = 10; sub test_my { my $x = 20; inner(); } sub test_loc { local $x = 30; inner(); } sub inner { print $x; } test_my(); # 10 yazdırır — my $x inner içinde görünmez $| = 1; test_loc(); # 30 yazdırır — local $x inner'da görünür

local, $_, $/, $@ gibi özel paket değişkenlerini değiştirmek için kullanılır.

Kandırmaca Soru

Aşağıdaki kodun çıktısı ne olacak ve neden?

our $a = 5; sub outer { my $a = 10; inner(); } sub inner { print $a; } outer();

Cevap: 5 yazdırır. Çünkü outer'daki my değişkeni $a inner'dan görünmez; kullanılan, our ile tanımlanmış paket değişkeni $a'dır.

Konunun incelikleri nedeniyle gerçek hata örnekleri


Hikaye

Bir günlük analizi scriptinde, sadece blok içinde değer değiştirdiklerini düşünerek, global bir hash'e local ile istatistik kaydedildi. Sonuç olarak, local ile yapılan değişiklikler programın diğer bölümlerine yayıldı ve veri kaybına yol açtı.

Hikaye

Modüler testlerde birçok geliştirici, my ile global özel değişkenleri (örneğin, $/) yeniden tanımlayarak değişiklik olmamasına ve testlerin garip bir şekilde kısmen “düşmesine” neden oldu.

Hikaye

JavaScript geliştirmesinden Perl'e geçtikten sonra, geliştiriciler gereksiz yere her yerde our ile değişken tanımlamaya alıştılar ve bu, kapsüllemeye zarar veren ve isim çakışmalarına yol açan beklenmedik global değişkenlerin ortaya çıkmasına neden oldu.