Thread Funktionen aus Modul parsen
(6 answers)
Opened by rosti at 2012-03-01 18:46 Quote Das kann entfallen, wenn die Subs im Hash als Stub deklariert werden. Es wird AutoLoad eingebunden und eine eigene Methode AUTOLOAD geschrieben. Damit erkennt UNIVERSAL::can auch diese Methoden, die nur bei Bedarf compiliert werden. Für Interessenten ein bischen Code: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 #!/usr/bin/perl package main; use strict; use warnings; use AutoLoader; use Data::Dumper; # Deklariere die Methoden # damit diese von AUTOLOAD gefunden werden sub foo; sub bar; # diese methoden liegen als source in einem hash # solch hash könnte z.B. mit DB_File als Datei angebunden sein my %mh = ( foo => q( my $self = shift; $self->{FOO} = 1; print "foo! @_\n"; ), bar => q( my $self = shift; $self->{BAR} = 1; print "bar!\n"; ), ); my $mo = main->new; # Instanz der main class # jetzt gucken wir mal, ob UNIVERSAL::can die Methode findet my $code = $mo->can('foo') or die "no method found"; $mo->$code(arg => 123); print Dumper $mo; # weitere Kontrolle, ob Attribut hinzugekommen ist # methods in class sub new{ my $class = shift; my $self = bless{}, $class; return $self; } # overload AUTOLOAD sub AUTOLOAD{ my $self = shift; my $sub = our $AUTOLOAD; $sub =~ s/.*:://; # extrahiere Klassen Name if(exists $mh{$sub}){ # aus der Source den Code erzeugen und ausführen my $code = eval "sub{$mh{$sub}}"; $self->$code(@_); } else{ return undef; } } Im Prinzip ist das eine Alternative zum Verzeichnis lib/auto/ Also keine *.al-Dateien mit einzelnen Methoden, sondern diese Methoden in einem Hash. Schön kompakt ;) Viele Grüße, Rosti |