Mojolicious Export不适用于Mojo :: Loader

时间:2014-01-15 19:21:07

标签: perl mojolicious

我从我的模块中导出了一些常量。在我的脚本中,我使用Mojo :: Loader

加载我的模块

我的模块

use constant FALSE        => 0;
use constant TRUE         => 1;

our @EXPORT = qw(FALSE TRUE);

在我的剧本中。

Mojo::Loader->new->load($my_module_name);

我能够在我的脚本中使用我的模块,但是我导出的常量在我的脚本中无法访问。如果我用use子句加载我的模块。我能够使用导出的常量。

任何想法如何解决这个问题并将常量导入我的脚本。

谢谢!

1 个答案:

答案 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')也是如此。

如果在BEGINrequire周围包裹import块,则可以省略括号。

因此,如果要导出常量,如果要继续使用Mojo :: Loader,请将括号添加到您调用它们的位置。