我的最终目标是使用参数作为包。我不能得到一个简单的例子来工作。有没有办法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.
答案 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;