我有一个带有模块名称的字符串,需要使用它来实例化一个对象。这怎么做得最好?我正在寻找像
这样的东西foo.pl
#!/usr/bin/perl
use strict;
use Bar;
my $module = "Bar";
my $obj = {$module}->new(); # does not work
$obj->fun (123);
Bar.pm
package Bar;
use strict;
sub new
{
my $self = {};
return bless $self;
}
sub fun
{
my ($self, $arg);
print "obj $self got arg $arg\n";
}
答案 0 :(得分:5)
你太复杂了。 $module->new
可以自行运行,没有{braces}:
$ perl -MXML::Simple -E 'use strict; my $foo = "XML::Simple"; my $obj = $foo->new; say $obj'
XML::Simple=HASH(0x9d024d8)
答案 1 :(得分:0)
除了提供的关于不必要的大括号的注释之外,您可能会对Class::MOP或Class::Load(对于更新的代码)感兴趣,尤其是load_class()
子例程,因为更具动态性加载模块/类。
答案 2 :(得分:-1)
您必须使用Perl函数eval
。
您还必须使用ref
来获取perl对象的名称。
但首先你的foo方法没有采用参数,这是一个更正版本:
package Bar;
use strict;
sub new
{
my $self = {};
return bless $self;
}
sub fun
{
my ($self, $arg) = @_;
print "obj ".ref($self)." got arg $arg\n";
}
1;
以下是测试脚本:
#!/usr/bin/perl
use strict;
use Bar;
my $module = "Bar";
my $obj = eval {$module->new()};
$obj->fun (123);
输出: obj Bar得到了arg 123