我从我的模块中导出了一些常量。在我的脚本中,我使用Mojo :: Loader
加载我的模块我的模块
use constant FALSE => 0;
use constant TRUE => 1;
our @EXPORT = qw(FALSE TRUE);
在我的剧本中。
Mojo::Loader->new->load($my_module_name);
我能够在我的脚本中使用我的模块,但是我导出的常量在我的脚本中无法访问。如果我用use子句加载我的模块。我能够使用导出的常量。
任何想法如何解决这个问题并将常量导入我的脚本。
谢谢!
答案 0 :(得分:1)
我看了一下Mojo :: Loader的代码,但事实证明它无法导入东西。它只执行require
(在字符串eval中),而不是use
。从源代码中快速了解到,没有任何import
,因此您需要自己致电Your::Module->import
。
Here's a link到源代码的相关部分和引用:
sub load { my ($self, $module) = @_; # Check module name return 1 if !$module || $module !~ /^\w(?:[\w:']*\w)?$/; # Load return undef if $module->can('new') || eval "require $module; 1"; # Exists return 1 if $@ =~ /^Can't locate \Q@{[class_to_path $module]}\E in \@INC/; # Real error return Mojo::Exception->new($@); }
这里有一些有趣的事情。如果您use foo
,导入将使用常量。
use foo;
print 'True: ', TRUE;
但是:
require foo;
foo->import;
print 'True: ', TRUE;
这将产生警告Bareword "TRUE" not allowed while "strict subs" in use
。所以我们放TRUE()
使它看起来不像是一个裸字。毕竟,常数是一个子。现在它会起作用。做Mojo::Loader->load('foo')
也是如此。
如果在BEGIN
和require
周围包裹import
块,则可以省略括号。
因此,如果要导出常量,如果要继续使用Mojo :: Loader,请将括号添加到您调用它们的位置。