我知道你可以使用eval和* {$ func_name}来动态调用函数,但是如何使用对象的方法呢?
例如
EZBakeOven
sub make_Cake { ... }
sub make_Donut { ... }
sub make_CupCake { ... }
sub make_Soup { ... }
sub make{
my($self,$item) = @_;
if( defined $self->make_$item ){ #call this func if it exists
$self->make_$item( temp => 300, with_eggs => true );
}
}
所以如果我说像
那样的话$self->make('Cake');
#or maybe I have to use the full method name
$self->make('make_Cake');
它会调用
$self->make_Cake();
答案 0 :(得分:3)
您应该可以执行以下操作:
sub make {
my ($self, $item) = @_;
my $method = "make_$item";
$self->$method(whatever);
}
修改:您可能还想使用can()
来确保调用可以调用的方法:
sub make {
my ($self, $item) = @_;
my $method = "make_$item";
if ($self->can($method)) {
$self->$method(whatever);
} else {
die "No such method $method";
}
}
编辑2:实际上,现在我想起来了,我不确定你是否真的能做到这一点。我之前编写过的代码做了类似的事情,但它没有使用对象,它使用了一个类(所以你在一个类中调用一个特定的函数)。它也可以用于对象,但我无法保证。
答案 1 :(得分:0)
正如@CanSpice建议使用can
来检查类和对象中存在的方法。
can
返回对方法的引用(如果存在),否则返回undef。
您可以使用返回的引用直接调用该方法。
以下示例在package / class context中调用该方法。 __PACKAGE__
返回当前的包/类名。
if ( my $ref = __PACKAGE__->can("$method") ) {
&$ref(...);
}