Perl'de değişkenlerin görünürlük alanı, my ve local anahtar kelimeleriyle belirlenir.
my, leksikal görünürlük alanına sahip bir değişken oluşturur (yalnızca mevcut blokta geçerlidir).local, bir global değişkenin mevcut değerini geçici olarak saklar ve blok var olduğu sürece yeni bir değer atar - genellikle yalnızca global değişkenlerle kullanılır (örneğin, $_, $/ vb.).Örnek:
my $x = 42; # yalnızca mevcut blokta görünür. { local $/ = undef; my $input = <STDIN>; # $/ burada undef, blok sonrası değeri geri alır. }
my kullanmak, daha öngörülebilir bir görünürlük alanı sunduğu için tercih edilir.
Aynı değişken ile my ve local kullanıldığında, farklı bloklarda ne olur?
Çoğu zaman
localvemy'nin aynı şekilde çalıştığını söylerler, ama bu doğru değil.localyalnızca global değişkenlerle çalışır (paket değişkenleri).myile tanımlanan bir değişken,localiçin görünmez.
Örnek:
our $foo = "global"; { local $foo = "local"; print $foo; # "local" } print $foo; # "global" { my $foo = "lexical"; } # $foo blok dışında - global versiyon, "lexical" değil.
Hikaye
Bir script'te, my ile tanımlanan bir değişkenin geçici olarak değiştirilmesi için local kullanıldı, bu da hiçbir sonuca yol açmadı ve içsel modüllerden birinde olay işleme hatalarına neden oldu.
Hikaye
Bir projede, foreach içinde $'yi local ile "lokalize" etmeye çalıştılar, ancak foreach'un zaten yeni bir $ belirttiğini unuttular. Sonuç - çalışmayan filtre ve yanlış döngü mantığı.
Hikaye
Paketin global değişkeni our ile tanımlanmamıştı ve local $var ile lokalleştirme girişimi, strict ve warning nedeniyle script'in çökmesine neden oldu, ve hata ayıklama bir gün sürdü.