Leser: 24
2015-01-12T15:11:30 rostiMaximale Anzahl Codezeilen msg #179193(...)
Das Stichwort zum Auslagern von Methoden/Funktionen lautet AUTOLOAD und ob Du den (default)AutoLoader verwendest, oder eine eigene sub AUTOLOAD{} bleibt Dir überlassen.
Eine weitere Überlegung betrifft Funktionen/Methoden, die grundsätzlich immer aufgerufen werden: Evntl. lässt sich damit ein Interface implementieren. Hierzu hilft my $coderef = $instanz->UNIVERSAL::can('methodname') beim Prüfen, ob die jeweilige Interface-Methode in der Subklasse definiert ist, wenn ja, wird sie ausgeführt ($instanz->$coderef), ansonsten eben nicht.
2015-01-13T08:25:05 MuffiEine sub AUTOLOAD ist ein übler Hack, den man mal machen kann, wenns wirklich in dem speziellen Fall die beste Lösung ist.
Aber es ist garantiert nicht "Das Stichwort" zum Thema auslagern.
2015-01-13T08:35:40 MuffiWeils z.B: gleich dein nächstes Beispiel mit UNIVERSAL::can komplett aushebelt.
2015-01-13T08:56:15 Muffi
QuoteEntweder Autoloader benutzen oder eine sub AUTOLOAD manuell (ohne Autoloader) schreiben.
QuoteIf the object's class hierarchy has two or more AUTOLOAD( ) definitions...
no warnings 'redefine';
QuoteThe AutoLoader module works with the AutoSplit module and the "__END__"
token to defer the loading of some subroutines ...
1 2 3 4 5 6 7 8 9 10 11 12 13
sub AUTOLOAD{ my $self = shift; # Name der Methode ermitteln my $mname = do{ our $AUTOLOAD =~ /(\w+)$/; $1; }; require "auto/$mname.pm"; # wirft Exception, wenn es die Datei nicht gibt my $code = $self->can($mname) || die "Die Methode '$mname' ist nicht definiert in Modul 'auto/$mname.pm'"; $self->$code(@_); } sub DESTROY{}
main->configini($path_ini_file); # 'main' als Ersatz für eine Instanz
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# File auto/configini.pm # keine package-Deklaration, es greift der default: package main; use strict; use warnings; use Config::Tiny; my $CFT = Config::Tiny->new; # gilt nur dateiweit # hier die Definition der Funktion sub configini{ my $self = shift; my $file = shift; return $CFT = Config::Tiny->read($file) || do{ $@ = "Error with CFG-File '$file': $Config::Tiny::errstr"; undef; }; } 1;
2015-01-14T09:45:22 MuffiJetzt kapier ich zwar noch weniger, vor allem nicht, was ein configini mit AUTOLOAD zu tun hat, aber gut.