1

假设您有一个带有Foo 包的模块(例如Foo.pm)。在其中存在许多子例程定义,包括foodefault的定义。

package Foo;
sub foo     { ... }
sub default { ... }

在您的主 perl 程序(例如test.pl)中,将值分配给子引用并调用它或调用默认值的正确方法是什么?

sub call_proc {
   my $args   = shift;
   my $subref = $args->{proc_name} // 'default';

   &$Foo::subref();                               # <====== Wrong
}
call_proc({ proc_name => q{foo} });               # make the call
4

3 回答 3

2

我已经这样做了UNIVERSAL::can

sub call_proc {
   my $args   = shift;
   my $subref = Foo->can($args->{proc_name}) // 'default';

   if ($subref) {
       &$subref();
   }
}
call_proc({ proc_name => q{foo} });      
于 2012-08-30T20:11:51.297 回答
1

如果$subrefsome_method_name,则&$subref(或$subref->())将尝试调用some_method_name 在当前包中调用的函数。根据程序的设置方式,您可能需要传递完全限定的子例程名称

call_proc( { proc_name => 'Foo::foo' });

或放入一些逻辑call_proc来限定它。有关如何执行此操作的想法,请参阅中的qualify_sub_name函数。Forks::Super::Util

您还可以安全地使用对函数的引用

call_proc( { proc_name => \&foo } );   # works if &foo is avail in current pkg
于 2012-08-30T20:05:24.240 回答
1

\&$name没有被严格的裁判抓住,所以:

sub call_proc {
   my $args     = shift;
   my $sub_name = $args->{proc_name} // 'default';
   my $sub_ref  = \&{ "Foo::" . $sub_name };
   #die if !defined(&$sub_ref);
   return $sub_ref->();
}

如果我们在谈论方法,那么它将是:

sub call_method {
   my $args        = shift;
   my $method_name = $args->{method_name} // 'default';
   #die if !Foo->can($method_name);
   return Foo->$method_name();
}
于 2012-08-30T20:32:07.497 回答