Perl'de klasik bir erişim modifikatörleri sistemi, yani public/private/protected yoktur. Fonksiyonlara ve verilere erişim yönetimi tamamen anlaşmalar ve değişkenlerin kapsamı ile yapılmaktadır.
my anahtar kelimesi (dosya veya blok içinde leksik erişim) ve sembollerin dışa aktarımı (Exporter veya kendi mekanizmaları aracılığıyla) kullanılır.@EXPORT, @EXPORT_OK), varsayılan olarak modül için "içsel" kalırken, istenirse her zaman paket ön eki ile açıkça çağrılabilirler._internal_sub) ile başlar; bu, gizlilik hakkında bir anlaşma işlevi görür.Örnek:
package MyLib; use Exporter 'import'; our @EXPORT_OK = qw(public_func); my $secret = 123; # Dışarıdan erişilemez. sub public_func { _internal_func(); } sub _internal_func { print "Bu içtsel! "; } 1;
Perl modülünün özel bir fonksiyonunu dışarıdan çağrılmaktan koruyan önlemler nelerdir? Onu doğrudan çağırmak mümkün mü?
Cevap: Aslında, bir paketin herhangi bir alt programını tam adıyla çağırmak mümkündür: MyLib::_internal_func(). Perl bu çağrıyı teknik olarak kısıtlamaz — koruma sadece anlaşma seviyesindedir.
Hikaye
Geliştirici,
@EXPORT_OKile kısıtlama yapmayı unutarak modülden çok fazla fonksiyonu dışa aktardı. Sonuçta, kullanıcılar içsel fonksiyonlara kazara erişim sağladı ve isim çakışmalarına ve API'nin yanlış kullanımına yol açtı.
Hikaye
Büyük bir projede, iki ekip aynı içsel metodu (_ ile başlayan) kullanıyordu ve bunun özel olduğunu düşünüyordu. Daha sonra fonksiyonun arayüzü değiştirildi, bu da sistemin diğer kısmındaki çağrıları bozdu.
Hikaye
Bir projede, dışarıdan geliştirilen bir modülü değiştirerek dışa aktarılmamış metodlarını doğrudan çağırdılar. Dağıtım güncellemesi sonrası modül çalışmayı durdurdu, çünkü içsel fonksiyon isimleri değişti ve bu, uygulamanın çökmesine yol açtı.