【问题标题】:Mojolicious Export does not work with Mojo::LoaderMojolicious 导出不适用于 Mojo::Loader
【发布时间】:2014-01-16 04:28:24
【问题描述】:

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

我的模块

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

our @EXPORT = qw(FALSE TRUE);

在我的脚本中。

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

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

知道如何解决这个问题并将常量导入我的脚本。

谢谢!!

【问题讨论】:

  • 请在导出常量的地方添加模块代码的相关部分。
  • @simbabque 检查更新的问题
  • 您使用 Mojo 模块有什么原因吗?

标签: perl mojolicious


【解决方案1】:

我查看了 Mojo::Loader 的代码,结果发现它无法导入内容。它只执行require(在字符串评估中),而不执行use。对源代码的快速 grep 显示没有任何 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 块包裹在requireimport 周围,则可以省略括号。

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

【讨论】:

  • 我也尝试过 my_module->import();但它没有帮助。仍然无法访问常量
  • 关于BEGIN 编辑:我相信这与编译时Perl 在内部识别为subs 的barewords 有关,但我无法解释。也许其他人可以?
  • 我在perldoc.perl.org/… 中找到了一个对半个解释的引用,上面写着 “因为 use 语句意味着一个 BEGIN 块,所以只要编译了 use 语句,语义的导入就会发生,在文件的其余部分被编译之前。这就是它如何能够作为一种编译指示机制,以及模块如何能够声明子例程,然后这些子例程对于当前文件的其余部分作为列表或一元运算符可见。 .
猜你喜欢
  • 1970-01-01
  • 2016-12-09
  • 2018-05-19
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
相关资源
最近更新 更多