我有一个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
#-------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我的错是什么?
fri*_*edo 10
当你说
use Foo;
Run Code Online (Sandbox Code Playgroud)
这相当于:
BEGIN {
require 'Foo.pm';
Foo->import;
};
Run Code Online (Sandbox Code Playgroud)
你已经在你的ex.pm名字中定义了包ex,所以当你use impex::ex,Perl做了一个隐含的impex::ex->import.但是没有命名的包impex::ex,因此您必须手动执行导入ex以获取符号.
正确的方法是将模块放在现有目录下,@INC并在相对于@INC目录的完整路径名后面命名包.所以你impex/ex.pm应该从这开始,package impex::ex;这就是你应该如何use做到的.
如果您担心软件包名称冗长且难以处理,请查看别名.