AUTOLOAD, bir paket içindeki var olmayan yöntemlerin veya işlevlerin çağrılarını dinamik olarak işlemenizi sağlar. Bu, proxy nesneleri oluşturmak, dinamik olarak üretilen yöntemler (ORM), tembel yükleme mantığını uygulamak vb. için kullanışlıdır.
AUTOLOAD kullanımı örneği:package MyAuto; sub AUTOLOAD { our $AUTOLOAD; my ($self, @args) = @_; my ($method) = $AUTOLOAD =~ /::(\w+)$/; print "Çağrılan $method ile @args "; } package main; my $obj = bless {}, 'MyAuto'; $obj->any_method(1,2,3); # AUTOLOAD'ı çağırır
new, DESTROY çağrılarını yakalamaz.Soru: new isimli var olmayan bir yapıcıyı çağırmaya çalışırsanız AUTOLOAD çağrılır mı?
Cevap: Hayır. Perl, new yapıcısını doğrudan paket içinde arar ve bulunamadığında AUTOLOAD'ı çağırmaz. AUTOLOAD, yalnızca normal yöntemler çağrıldığında çağrılır, nesne oluşturma girişimlerindeki Class->new() için değil.
package Foo; sub AUTOLOAD { print "AUTOLOAD! "; } # $obj = Foo->new(); # Hata: Can't locate object method "new" ...
Hikaye Kriptografik bir hizmette, çok sayıda benzer yöntemi proxy'leme için AUTOLOAD kullanıldı. Bir gün
DESTROYyönteminin işlenmesini unuttular ve nesnelerin sonlandırılması sırasında sonsuz rekursif çağrılar meydana geldi, bu da scriptin çökmesine yol açtı.
Hikaye ORM'de alanlara erişim büyüsü için AUTOLOAD kullanıldı, ancak yöntem gerçekten yoksa doğru bir değer dönüşü sağlamadı. Bu nedenle perl, "Can't locate..." yerine kafa karıştırıcı bir mesaj veriyor ve hatalar yalnızca prodüksiyon ortamında belirgin hale geliyordu.
Hikaye Yeniden yapılandırma sırasında bazı gerçek yöntemler kaldırıldı, bu da tüm çağrıların AUTOLOAD aracılığıyla yapılmasına neden oldu. Bu, büyük görevlerin performansında ani bir düşüşe yol açtı (milyonlarca nesnenin işlendiği dizi, yeniden yapılandırmadan önce 10-15 kat daha yavaş hale geldi).