Perl'de değişkenleri tanımlamak için üç ana tür vardır: my, our ve state.
sub example_state { state $counter = 0; $counter++; return $counter; } for (1..3) { print example_state(), " "; # 1, ardından 2, ardından 3 yazdırır }
Doğru kullanımı:
my — değişkenler için neredeyse her zaman tercih edilen seçimdir, küresel erişim gerektirmediği sürece.our — bir modül arasında değişkenleri dışa aktarmak için, paylaşıma ihtiyaç duyulduğunda.state — bir değişkenin fonksiyon çağrıları arasında değerini "hatırlaması" gerektiğinde (örneğin, çağrı sayacı).our ile tanımlanan bir değişken, my ile birlikte bir kapalı (closure) içinde kapatılabilir mi?
Genellikle “evet, bu kullanışlı” diye yanıtlanır, ancak durum böyle değildir. our değişkeni, paket için küreseldir ve kapalı (closure) temel olarak onu ortaya çıkma anında değeriyle bağlamaktan ziyade küresel isim üzerinden erişimi gerçekleştirir. Bu nedenle, onun "değeri" kapalı (closure) dışından değiştirilebilir ve tüm kapalı (closure) yapıları etkileyebilir!
our $x = 10; my $closure = sub { return $x; }; $x = 42; print $closure->(); # 10 yerine 42 döner
Hikaye
Büyük bir günlük ayrıştırma scriptinde, değişkenler farklı modül fonksiyonlarından "rahat erişim" sağlamak için our ile tanımlanıyordu. Sonuç olarak, bu değişkenlerin bir fonksiyondaki değişiklikleri diğerinde beklenmedik davranışlara yol açarak günlüklerin paralel işlenmesini bozuyordu.
Hikaye
Fonksiyon çağrıları arasında değerlerinin korunması gereken değişkenler için my kullanımı (örneğin, özyinelemeli geçişte sayaç) her çağrıda değerin sıfırlanmasına neden olarak geçiş mantığında hatalara yol açıyordu. state ile değiştirmek durumu düzeltmişti.
Hikaye
İçeri aktarılan bir modülde our'ın yanlış kullanımı (değişkenleri Exporter aracılığıyla dışa aktarmamak) iki farklı modülün aynı değişken adını kullanması nedeniyle ad çakışmasına yol açtı. Sonuç olarak, veriler bir bağlamdan diğerine "atladı".