我确定这在文档的某个地方有所涉及,但我一直无法找到它......我正在寻找能够在类名称存储在哈希中的类上调用方法的语法糖(而不是简单的标量):
use strict; use warnings;
package Foo;
sub foo { print "in foo()\n" }
package main;
my %hash = (func => 'foo');
Foo->$hash{func};
Run Code Online (Sandbox Code Playgroud)
如果我首先复制$hash{func}到标量变量,那么我可以调用Foo->$func就好......但是缺少什么来启用Foo->$hash{func}它?
(编辑:我不是要通过在类上调用一个方法来做任何特殊的事情Foo- 这可能很容易成为一个受祝福的对象(在我的实际代码中);它只是更容易编写一个自包含的使用类方法的示例.)
编辑2:为了完整性,请回答下面的评论,这就是我实际在做的事情(这是在Moose属性糖库中,用Moose :: Exporter创建的):
# adds an accessor to a sibling module
sub foreignTable
{
my ($meta, $table, %args) = @_;
my $class = 'MyApp::Dir1::Dir2::' . $table;
my $dbAccessor = lcfirst $table;
eval "require $class" or do { die "Can't load $class: $@" };
$meta->add_attribute( …Run Code Online (Sandbox Code Playgroud) 假设我有一个包含所有子程序名称的数组,我想逐个调用.
foreach $sub (@arr){
print "Calling $sub\n";
#---How to call $sub?----
&$sub; ## will not work
}
Run Code Online (Sandbox Code Playgroud) 是否可以使下面的示例正常工作,以便通过标量变量存储和调用子例程的名称?
use strict;
use warnings;
sub doit {
my ($who) = @_;
print "Make us some coffee $who!\n";
}
sub sayit {
my ($what) = @_;
print "$what\n";
}
my $action = 'doit';
$action('john');
Run Code Online (Sandbox Code Playgroud)