Soru geçmişi:
Perl'de değişkenlerin kapsamı, my (lexikal görünürlük) ve local (dinamik geçici atama) operatörleri ile sınırlandırılabilir. local, küresel değişkenlerin ve özel tanımlayıcıların (örneğin $_, $/, $@, %ENV) yeniden tanımlanmasında yaygın olarak kullanılır.
Sorun:
Ana sorun, dinamik ve lexikal kapsam arasındaki karışıklıktır. local, yeni bir değişken oluşturmaz, bunun yerine bir blok içinde yürütülme süresi içinde küresel (veya package) bir değişkenin değerini geçici olarak değiştirir. Bu, $/ (satır ayırıcı), $_ (varsayılan değişken), $^W (uyarı bayrağı), %ENV, STDIN/STDOUT gibi değişkenlerin yeniden atanmasında özellikle kritik öneme sahiptir.
Çözüm:
Kod örneği:
our $Global = "Hello!"; sub change1 { my $Global = "Bye!"; print "$Global "; } sub change2 { local $Global = "Bye!"; print "$Global "; } print "$Global "; # Hello! change1(); # Bye! print "$Global "; # Hello! change2(); # Bye! print "$Global "; # Hello!
Anahtar özellikler:
Local, my ile tanımlanan lexikal değişkenlere uygulanabilir mi?
Hayır, local yalnızca package küresel değişkenlerle çalışır. my objeleri üzerinde etkisizdir.
Özel tanımlayıcılara, örneğin, STDIN'e local uygulandığında ne olur?
STDIN/STDOUT/stdin geçici olarak local ile yeniden atanabilir, örneğin, bir alt programda girdi/çıktı akışını küresel etki olmadan değiştirmek için. Blok dışına çıkıldığında handle geri yüklenir.
Recursive fonksiyon çağrısı durumunda local ile my arasındaki kritik fark nedir?
local, bir değer yığınının "push/pop" düzenini sağlar - her çağrı, paketin değerini geçici olarak yeniden tanımlar ve iç içe çağrılar bu yeniden tanımlanan değeri alır. my, içeri miras almadan blok içinde tek bir lexikal değeri sağlar.
Testte local kullanarak %ENV'yi değiştiren kod, blok dışına çıktıktan sonra diğer iş parçalarında beklenmedik yan etkiler oluşturur çünkü kod çok iplikli ve local yanlış amaçlarla uygulanmıştır.
Artılar:
Eksiler:
Özel değişkenler ($/, $@, $SIG) yalnızca gerekli blok çağrısı süresince değiştirilir, ardından değişiklikler düzgün bir şekilde geri alınır.
Artılar:
Eksiler: