引用Perl中带有字符串的模块

时间:2014-02-07 10:20:56

标签: perl perl-module

我有一个带有模块名称的字符串,需要使用它来实例化一个对象。这怎么做得最好?我正在寻找像

这样的东西

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";
}

3 个答案:

答案 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::MOPClass::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