AUTOLOAD ermöglicht die dynamische Behandlung von Aufrufen nicht vorhandener Methoden oder Funktionen in einem Paket. Dies ist nützlich für die Erstellung von Proxy-Objekten, dynamisch generierten Methoden (ORM), die Implementierung von Lazy-Loading-Logik usw.
AUTOLOAD:package MyAuto; sub AUTOLOAD { our $AUTOLOAD; my ($self, @args) = @_; my ($method) = $AUTOLOAD =~ /::(\w+)$/; print "Aufgerufen $method mit @args "; } package main; my $obj = bless {}, 'MyAuto'; $obj->any_method(1,2,3); # Führt AUTOLOAD aus
new, DESTROY ab.Frage: Wird AUTOLOAD aufgerufen, wenn versucht wird, einen nicht existierenden Konstruktor new aufzurufen?
Antwort: Nein. Perl sucht den Konstruktor new direkt im Paket und ruft AUTOLOAD nicht dafür auf, wenn er nicht gefunden wird. AUTOLOAD wird nur bei normalen Methodenaufrufen aufgerufen, nicht bei dem Versuch, ein Objekt über Class->new() zu erstellen.
package Foo; sub AUTOLOAD { print "AUTOLOAD! "; } # $obj = Foo->new(); # Fehler: Kann Objektmethode "new" nicht finden ...
Geschichte In einem kryptographischen Dienst wurde über AUTOLOAD die Proxifizierung vieler einheitlicher Methoden realisiert. Einmal wurde vergessen, die Situation mit der Methode DESTROY zu behandeln, was zu endlosen rekursiven Aufrufen bei der Finale von Objekten führte, die das Skript zum Absturz brachten.
Geschichte In ORM wurde AUTOLOAD für die magische Zugriff auf Felder verwendet, jedoch wurde keine korrekte Rückgabewertimplementierung realisiert, wenn die Methode tatsächlich fehlte. Dadurch gab Perl anstelle von "Kann nicht finden..." eine verworrene Fehlermeldung aus, und die Bugs traten nur in der Produktion auf.
Geschichte Bei der Refaktorisierung wurden Teile echter Methoden entfernt, sodass alle Aufrufe über AUTOLOAD liefen. Dadurch fiel die Leistung großer Aufgaben drastisch ab (die Verarbeitung eines Arrays aus Millionen von Objekten dauerte 10–15 Mal länger als vor der Refaktorisierung).