Probleme mit AUTOLOAD in UNIVERSAL?

06/11/2007 - 21:29 von Frank Seitz | Report spam
Hallo zusammen,

um in Programmen nicht immer Kaskaden von uses schreiben
zu müssen, habe ich eine AUTOLOAD-Methode geschrieben,
die ich in UNIVERSAL installiere, die beim ersten
Methodenaufruf für eine Klasse das betreffende Modul
automatisch làdt und dann die Methode aufruft. Code:

package UNIVERSAL;

sub AUTOLOAD {
my $this = shift;

my ($module,$sub) = our $AUTOLOAD =~ /^(.*)::(\w+)$/;
return if $sub !~ /[^A-Z]/;

eval "use $module";
die $@ if $@;

return $this->$sub(@_);
}

Scheint zu funktionieren.

Es gibt auf CPAN Module, die dasselbe oder àhnliches tun.
Ich habe mir diese nicht genauer angesehen, sie scheinen
komplizierter zu sein. In einer Doku habe ich einen Kommentar
gefunden, der mich nachdenklich macht:

There are many other issues with AUTOLOAD that this module
does not address. Primary among them is the fact that if
you call a function that does not exist in a package that
inherits from one with an AUTOLOAD, Perl will do a method search
for that AUTOLOAD. This is why this module does not install
AUTOLOAD in UNIVERSAL by default, and it is strongly
suggested that you not do so either.
(http://search.cpan.org/~tilly/Class-AutoloadCAN-0.03/lib/Class/AutoloadCAN.pm)

Hat jemand eine Idee, was das angesprochene Problem
mit AUTOLOAD in UNIVERSAL sein soll? Ich verstehe das nicht.

Grüße
Frank
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
 

Lesen sie die antworten

#1 Ekki Plicht (DF4OR)
06/11/2007 - 22:54 | Warnen spam
Frank Seitz wrote:

Hallo zusammen,

um in Programmen nicht immer Kaskaden von uses schreiben
zu müssen, habe ich eine AUTOLOAD-Methode geschrieben,
die ich in UNIVERSAL installiere, die beim ersten
Methodenaufruf für eine Klasse das betreffende Modul
automatisch làdt und dann die Methode aufruft. Code:

package UNIVERSAL;

sub AUTOLOAD {
my $this = shift;

my ($module,$sub) = our $AUTOLOAD =~ /^(.*)::(\w+)$/;
return if $sub !~ /[^A-Z]/;

eval "use $module";
die $@ if $@;

return $this->$sub(@_);
}

Scheint zu funktionieren.

Es gibt auf CPAN Module, die dasselbe oder àhnliches tun.
Ich habe mir diese nicht genauer angesehen, sie scheinen
komplizierter zu sein. In einer Doku habe ich einen Kommentar
gefunden, der mich nachdenklich macht:

There are many other issues with AUTOLOAD that this module
does not address. Primary among them is the fact that if
you call a function that does not exist in a package that
inherits from one with an AUTOLOAD, Perl will do a method search
for that AUTOLOAD. This is why this module does not install
AUTOLOAD in UNIVERSAL by default, and it is strongly
suggested that you not do so either.



(http://search.cpan.org/~tilly/Class-AutoloadCAN-0.03/lib/Class/AutoloadCAN.pm)

Hat jemand eine Idee, was das angesprochene Problem
mit AUTOLOAD in UNIVERSAL sein soll? Ich verstehe das nicht.



Ich kenne AUTOLOAD in UNIVERSAL nur aus der Theorie, aber den obenstehenden,
englischen Absatz verstehe ich so, das es durch Mehrfachvererbung zu
konkurrierenden Aufrufen von UNIVERSAL kommen könnte, wenn mehrere Packages
das (per default und ohne ausdrücklichen Hinweis darauf) implementieren.

Ich musste den Abschnitt aber auch fünfmal lesen, bevor ich den Sinn
verstanden habe. Evtl. feh t da das eine oder andere Komma. Vielleicht ist
es so einleuchtender:

Primary among them is the fact that,
if you call a function that does not exist,
in a package that inherits from one with an AUTOLOAD,
Perl will do a method search for that AUTOLOAD.
(2 Kommata von mir zugefügt).

This is why this module does not install
AUTOLOAD in UNIVERSAL by default, and it is strongly
suggested that you not do so either.

Da Perl den Vererbungsbaum zuerst in die Tiefe und dann erst in die Breite
durchsucht könnte es also vorkommen, das eine andere als deine
AUTOLOAD-Routine früher gefunden wird. Ob die dann das tut was Du
erwartest? Deswegen soll man solche Sachen wohl nicht per Default
verwenden, oder wenn, dann dick und fett darauf hinweisen.

Gruß,
Ekki

Ähnliche fragen