9

我有一个 perl 问题:导入符号,具体取决于路径元素@INCuse语句。

如果我将完整路径放入@INC,则导入有效。如果路径的一部分在use语句中,则执行要导入的模块,但必须显式完成导入:

########################################
# @INC has: "D:/plu/lib/"

#------------------------------------------------
# Exporting file is here: "D:/plu/lib/impex/ex.pm"
#
use strict;
use warnings;
package ex;

use Exporter;
our @ISA = 'Exporter';
our @EXPORT = qw( fnQuark );

sub fnQuark { print "functional quark\n"; }

print "Executing module 'ex'\n";
1;

#------------------------------------------------
# Importing file, example 1, is here: "D:/plu/lib/impex/imp.pl"
#
use strict;
use warnings;
package imp;

use impex::ex;

ex->import( @ex::EXPORT );    # removing this line makes fnQuark unavailable!
                              # Why is this necessary, 'ex.pm' being an Exporter?
fnQuark();

#------------------------------------------------
#  Importing file, example 2, is here: "D:/plu/lib/impex/imp2.pl"
#
use strict;
use warnings;
package imp2;

use lib 'D:/plu/lib/impex';
use ex;

fnQuark();                    # works without explicit import
#-------------------------------------------------

我的错误是什么?

4

1 回答 1

10

当你说

use Foo;

这相当于:

BEGIN { 
    require 'Foo.pm';
    Foo->import;
};

您已经在您的包中定义了ex.pm要命名的包ex,所以当您使用时use impex::ex,Perl 会执行一个隐含的impex::ex->import. 但是没有名为 的包impex::ex,因此您必须手动导入 fromex以获取符号。

正确的方法是将模块放在现有目录下,@INC并在相对于目录的完整路径名之后命名包@INC。所以你impex/ex.pm应该开始,package impex::ex;这就是你应该如何做的use

如果您担心包名称又长又笨重,请查看aliased

于 2012-06-22T09:16:20.387 回答