我有一个perl问题:导入符号,具体取决于@INC
和use
语句中的路径元素。
如果我将完整路径放入@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
#-------------------------------------------------
我的错误是什么?
答案 0 :(得分:10)
当你说
时use Foo;
这相当于:
BEGIN {
require 'Foo.pm';
Foo->import;
};
您已将ex.pm
中的程序包定义为ex
,因此当您use impex::ex
时,Perl会执行隐式impex::ex->import
。但是没有名为impex::ex
的包,因此您必须手动从ex
导入以获取符号。
执行此操作的正确方法是将模块放在@INC
中的现有目录下,并在相对于@INC
目录的完整路径名之后命名该程序包。因此,impex/ex.pm
应该以{{1}}开头,这就是package impex::ex;
的方式。
如果您担心软件包名称冗长且难以处理,请查看aliased。