【问题标题】:Perl explicitly using module UNIVERSAL causes a module to not export any symbolsPerl 显式使用模块 UNIVERSAL 导致模块不导出任何符号
【发布时间】:2011-04-08 10:12:03
【问题描述】:

我有两个 perl 模块,一个是“对象库”,另一个是从这个“对象库”模块导入函数。当我编译第二个模块 (perl -c Foo/Bar/NewObject.pm) 时,它编译时没有任何警告。

问题是,如果我在编译第二个模块 (perl -MUNIVERSAL -Mstrict -wc Foo/Bar/NewObject.pm) 时包含 UNIVERSAL 模块,它会引发如下警告:
"set" 不是由 Foo::Bar::Object 模块导出的

所以我的问题是为什么包含 UNIVERSAL 会导致 Exporter 函数无法从“对象库”模型中导出符号?

模块外观示例如下。

对象基础:

#!/usr/bin/perl -w  

use strict;  

package Foo::Bar::Object;

use Exporter;

our @ISA = qw(Exporter);

our @EXPORT = qw( new set get update create  );

... 

1;

第二个模块:

#!/usr/bin/perl -w  

use strict;  

package Foo::Bar::NewObject;

use Foo::Bar::Object qw( new set get );

... 

1;

【问题讨论】:

  • 这里的代码对我来说很好用。问题很可能出现在您未显示的代码中。
  • 你为什么要使用UNIVERSAL?你想达到什么目的?默认情况下,所有包都已从 UNIVERSAL 继承。
  • 提示:perl -wc Foo/Bar/NewObject.pm 不如perl -wce'use Foo::Bar::NewObject。不知道这里是否重要。
  • 您是否有任何循环依赖(A 使用 B,B 使用 A,可能不是直接)?查看http://www.perlmonks.org/?node_id=778639

标签: perl


【解决方案1】:

我最终通过遵循 @ikegami 在 cmets 中链接的内容解决了这个问题。我不得不将 @EXPORT 包装在 BEGIN {} 块中,这似乎可行。

在导出之前一定有一个模块尝试使用这些方法。

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2015-06-18
    • 1970-01-01
    • 2018-10-27
    • 2017-04-10
    相关资源
    最近更新 更多