我有一个情况,如果我能够动态创建包(package),那将会很有帮助。以下代码不能运行,但是说明了我的意图。
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $basename = "Xma";
my $len = 7;
my $newClass = sprintf("%s%d", $basename, $len);
printf("New class is %s\n", $newClass);
package $newClass {
# Early modules.
our @enum; BEGIN { @enum = qw( I_VAL I_SLOPE ); }
use parent qw(Exporter);
use enum::fields @enum;
our @EXPORT = (@enum);
our $classLen = $len;
our $classBasename = $basename;
sub new {
my $invocant = shift;
my $self = bless ([], ref $invocant || $invocant);
return($self);
}
}
1;
我在我的新类中添加了“额外”的内容,以说明这个新类是一个复杂的类,并且将出现在继承链中。
我知道我可以使用以下代码创建简单的包:
*{ "${class}::new" } = sub { return bless { }, $class };
但是我的新类/包将会非常大,因此我希望有些更容易维护的东西。
你们当中好奇的人可能会问:“为什么呢?”好奇心是一个重要因素。我需要在加载/编译时尽可能处理多的内容,并尝试避免几百万次运行时查找。我需要经常更改$basename和$len,但仅在编译时更改。而最重要的原因是好奇心。
eval($code)
你可以使用模板来生成$code
。 - ikegamirequire($package_file)
(或require Package::Name;
),如果您在运行时构建包(并将其转储到文件$package_file
)。 - zdim