Leser: 23
use base qw(Exporter mylogger hglconfig);
2010-04-13T09:26:16 mark05ein $::mylogger=mylogger->new(); funktioniert hingegen.
2010-04-13T09:43:29 pqmodule sind dafür da, naja, um deine applikation modular zu machen. dein zweites modul, was jetzt eine globale variable verändert, wird immer nur mit diesem hauptmodul funktionieren.
2010-04-13T10:14:00 esskarich hab ja noch nicht verstanden, warum du varibalen ändern musst.
was willst du denn genau haben?
hat jedes modul einen eigenen logger?
dann sollten deine module eine funktion get_logger haben, die dann dein daemoon aufruft und diesen logger dann in einer liste von loggern speichert, und die dann aufruft, wenn es was zu loggen gibt.
2010-04-13T12:00:09 topegDann ist es besser diese API als Klasse zu implementieren und als Objekt an das Plugin zu übergeben. Das hat den Vorteil, dass man am Hauptprogramm schrauben kann ohne Angst haben zu müssen damit Plugins zu zerstören. Ein Objekt zu übergeben, hat auch den Vorteil, dass du die Anfragen der Plugins nochmal auf Richtigkeit Prüfen kannst, und die Plugins sauber voneinander trennst (wenn du mal auf die Idee kommst mehr als ein Plugin gleichzeitig zu laden).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
package Daemon; sub load_module { my ($self, $module_class) = @_; $module_class->new( daemon => $self ); } sub log { my $self = shift; print STDERR @_; } 1; package Daemon::Plugin; use base qw/Class::Accessor::Faster/; __PACKAGE__->mk_accessors(qw/daemon/); 1;
1 2 3 4 5 6 7 8
package MyModul; use base qw/Daemon::Plugin/; sub foo { my $self = shift; $self->daemon->log("foo called in package " . __PACKAGE__ ); }
2010-04-13T12:23:37 esskarja, schon, aber deine Kinder/Module/Plugins müssen ja irgendwie an das Haupt-Modul rankommen. ich würde das ganze so tun:
Code (perl): (dl )1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20package Daemon; sub load_module { my ($self, $module_class) = @_; $module_class->new( daemon => $self ); } sub log { my $self = shift; print STDERR @_; } 1; package Daemon::Plugin; use base qw/Class::Accessor::Faster/; __PACKAGE__->mk_accessors(qw/daemon/); 1;
alle deine module leiten jetzt von Daemon::Plugin ab, und können intern dann den daemon nutzen
Code (perl): (dl )1 2 3 4 5 6 7 8package MyModul; use base qw/Daemon::Plugin/; sub foo { my $self = shift; $self->daemon->log("foo called in package " . __PACKAGE__ ); }
1 2 3 4 5 6 7 8 9
package Daemon::Plugin; sub daemon { my ($self,$value) = @_; $self->{daemon} = $value if @_ == 2; return $self->{daemon}; } 1;
__PACKAGE__->mk_accessors(qw/daemon/);
1 2 3 4 5
sub daemon { my $self = shift; $self->{daemon} = $_[0] if @_; return $self->{daemon}; }
GuestEs ist schon 2010, Perl 5.12 ist raus, aber modernes Perl ist nicht wirklich in den Köpfen der üblichen Verdächtigen in diesem Forum angekommen. Das sieht man ganz deutlich an den Antworten auf diese Frage. Dabei ist die ideale Lösung für exakt dieses Problem schon seit 1986 propagiert: Mixins (in Moose: Rollen).
Guest ҉mixin und Moose funktionieren mit 5.8.
2010-04-13T13:41:58 esskardu hast http://www.perl-community.de/bat/poard/thread/1493... gelesen?
Class::Accessor
2010-04-13T13:53:12 esskarich weiß ja nicht, wie du es genau gemacht hast.
hab es nicht ganz nochvollziehen können.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
foreach my $stage1 (@dir) {
# erst einlesen da sich das verzeichnis ja veraendert bzw files hinzukommen
next if $stage1 =~ /^\.\.?$/x;
next if (not($stage1 =~ /.pl$/x));
next if $stage1 =~ /EXAMPLE/ ;
$mylogger->log2sys("lese modulfile $modules/$stage1");
require "$modules/$stage1";
my ($aa,$bb,$cc,$dd);
($aa,$bb) = split (/\.pl/x,$stage1,2);
($cc,$dd) = split (/\_/x,$aa,2);
#my $yes = "modul\_$dd\_enable";
my $runmod = \&$aa;
my $return = \$runmod->("init") ;
$mylogger->log2sys ("m_init | return code = ${$return}") if ((${$dbg}) and (${$return}));
}
1
2
3
4
5
6
7
8
9
sub mein_modul {
my $action = shift;
$mylogger-log2sys("textausgabe");
bla bala perl code
}
1;
2010-04-13T14:45:18 esskares sieht aber aus, als ob du gar kein OO machst oder?
mir fehlt ja ein ->new
deine module sind anscheinend auch .pl script und gar keine .pm module.
ich würde deinen vorhandenen "kladardatsch" neu schreiben, mit dem ansatz, den ich dir oben gegeben hab.