3

在 Perl 中,我知道你可以动态地使用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();
4

2 回答 2

4

您应该能够执行以下操作:

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:实际上,现在我想起来了,我不确定你是否真的能做到。我之前写的代码做了类似的事情,但它不使用对象,它使用一个类(所以你在一个类中调用一个特定的函数)。它可能也适用于对象,但我不能保证。

于 2011-10-18T22:24:06.940 回答
2

正如@CanSpice 建议的用于can检查类和对象中存在的方法。 can如果存在则返回对该方法的引用,否则返回 undef。您可以使用返回的引用直接调用该方法。

以下示例调用包/类上下文中的方法。__PACKAGE__返回当前包/类名。

if ( my $ref = __PACKAGE__->can("$method") ) {
    &$ref(...);
}
于 2018-03-15T09:37:18.850 回答