如何使用具有变量名称的包

时间:2014-01-28 00:01:56

标签: perl variables module package

我的最终目标是使用参数作为包。我不能得到一个简单的例子来工作。有没有办法use $variable作为我的套餐?

MyModule.pm

package MyModule;
use strict;
use warnings;
use parent 'Exporter'; # imports and subclasses Exporter

our $test="hello world\n";
our @EXPORT = qw($test);

program.pl

#!/usr/bin/perl
use strict;
use warnings;

my $x = 'MyModule.pm';
eval "require $x";
MyModule->import;
print "$test\n";

错误

Global symbol "$test" requires explicit package name at ./program.pl line 8.
Execution of ./program.pl aborted due to compilation errors.

1 个答案:

答案 0 :(得分:1)

require有两种语法;一个期望一个不带引号的包名称(例如require Foo::Bar;),另一个期望一个产生文件名的表达式(例如require "Foo/Bar.pm";)。请注意,后者仍然会搜索库目录,并在组件之间使用/,即使在使用其他路径分隔符的系统上也是如此。

您:

my $x = 'MyModule.pm';
eval "require $x";

尝试评估代码require MyModule.pm正在混淆两个表单并给出错误Bareword "pm" not allowed while "strict subs" in use(由eval捕获并放在$ @中)。

所以要么只做my $x = 'MyModule';(并检查eval是否捕获了错误,为了健壮)或者只是这样做:

my $x = 'MyModule.pm';
require $x;

(或eval { require $x }如果你想捕获错误。)

这仍然会给你$test带来严格错误,因为$test直到运行时才导出,严格检查是在编译时;要解决这个问题,您需要能够在编译时执行您的需求:

#!/usr/bin/perl
use 5.014;
use warnings;

BEGIN {
    my $x = 'MyModule';
    my $filename = "$x.pm" =~ s!::!/!gr;
    require $filename;
    $x->import;
}
say $test;