基本上,我想要实例化我的跟踪器:
my @classes = qw(debug token line src match);
my $trace = Tracer->new(\@classes);
我应该能够调用跟踪器动态定义的方法:
$trace->debug("hello, world");
$trace->match("matched (%s)(%s)(%s)(%s)(%s)", $1, $2, $3, $4, $5);
因此,我的Tracer类将如下所示:
package Tracer;
sub new {
my $class = shift;
my $self = {};
my @traceClasses = @{$_[0]};
bless $self, $class;
for (@traceClasses) {
# This next line is wrong, and the core of my question
$self->$_ = new TraceSlave($_, ...)->trace
} # for (@traceClasses)
}
这段代码无法编译。基本上,我想定义Tracer实例的方法,作为TraceSlave实例的跟踪方法;通过循环实现。
我可以使用AUTOLOAD或eval实现,但那样做是错误的。正确的方法是什么?
这里是完整的TraceSlave。它没问题。
package TraceSlave;
sub new {
my $self = { header => $_[1], states => $_[2], stateRef => $_[3] };
bless $self, $_[0];
return $self;
} # new()
sub trace {
my $self = shift;
my @states = @{$self->{states}};
if ($states[${$self->{stateRef}}]) { # if trace enabled for this class and state
my @args;
for (1..$#_) { ($args[$_-1] = $_[$_]) =~ s/\n/\\n/g; } # Build args for sprintf, and replace \n in args
print $self->{header}.sprintf($_[0], @args)."\n";
}
} # trace()
AUTOLOAD
函数有什么问题?http://perldoc.perl.org/AutoLoader.html - mpapecAUTOLOAD
应该只在每个方法的第一次调用时变慢。您可以在此首次调用中为所有未来的方法请求创建方法。 - mpapec