一 Perl模块相关
(1) @INC
'@INC' 是perl 的一个'特殊列表标量',它储存着你当前版本的Perl模块的路径
特点: 编译时,Perl会'根据@INC存储的路径'去查询用户所调用的模块,具体的是'那些目录',通过命令行键入'perl -V' 来查看
'%INC' 当Perl程序中'调用'的'文件或模块'被找到后,Perl会叫这些'信息存放'在%INC这个哈希中去,其中的key为'模块的名字',value为模块'完整的路径'名
查找过程: 当你提交一个'use Module'的时候,就会'指示perl去搜索@INC数组中'是否有此模块名
备注: "."这个目录表示当前的'工作'目录
+++++++++++++++'方式一'-->需求: 向@INC中'添加自定义目录'+++++++++++++++
1)'末尾'添加 -->'最后查询'
BEGIN {
push @INC, '/my/dir'
}
2)'首部'添加 --> '首先查找'
BEGIN {
unshift @INC, '/my/dir'
}
push(@INC,"/my/dir"); --> '其它方式1'
可以用'环境变量'PERL5LIB来设置'增加查找'路径; --> '其它方式2'
注意事项: 需要'使用BEGIN块'在'编译时'向@INC中添加值,此时是'perl检查模块'的时刻,如果等到'程序被编译'的时候'太晚'了,perl会‘抛出一个异常‘,说"在@INC中无法找到Module"
(2)use关键字
理解上: 'use'类似Java的'import'关键字,进行'导包'加载
特点: '编译器'指令,'控制'从一个模块中'导入'子例程和变量
① use strict注意事项
如果'用了use strict'; 则必须在'每个变量前加my'将其声明为'本地变量'
避免:编译出现了"Global symbol variable requires explicit package name at "的错误
① 通过use lib向@INC中添加自定义目录
+++++++++++++++'方式二'-->需求: 向@INC中'添加自定义目录'+++++++++++++++
场景: 模块安装到'非标准目录'的情况
use lib '/my/dir'; --> use'加载模块'
use lib dirname(__FILE__) . "/lib"; -->'.'是字符串连接符
备注: use lib用法可以'起到'和BEGIN{unshift @INC,$dir}一样的'效果'
③ use中双冒号用法
+++++++++++'use Foo::Bar意味着什么'+++++++++++
1)use Foo::Bar'并不意味着'在@INC的目录中'寻找一个叫做Foo::Bar.pm'的模块文件
2)它的意思是在'@INC的目录中'寻找一个叫做'Foo的子目录',然后在其中找一个叫做"Bar.pm的模块"
3)现在如果我们成功"use加载了"一个模块,那么我们就可以通过'完整的包路径'语法'&PACKAGE::FUNCTION'使用这个模块中的'所有函数'
4)当我们说&Foo::Bar::some_func的时候,我们指的是"包的名字"而'不是'那个在use中曾使用的'包含路径的文件名'
5)这会允许你可以在一个'use过的文件中'包含很多'包名字',实际使用中这些'名字通常是相同'的
++++++++++++++++++'案例剖析'++++++++++++++++++
use File::Basename;
根据'@INC'查询文件所在的'路径': /usr/share/perl5/File/Basename.pm
解读: '/usr/share/perl5'是'@INC'的一个模块查询目录,'File/Basename.pm'是该目录下的'文件'
④ use 仅选用模块中的部分函数
场景: '子程序中'和'模块的函数'有'同名'函数,'而且'子程序中已经'将自己的子程序'-->例如&dirname作为了perl的子程序
需求: '不用'模块中的'同名的子程序',可以在'引入模块'的时候,'只指定'必需使用的函数
++++++++++++'方式一'++++++++++++
use File::Basename qw/basename/; -->'列表的形式-->引入特定函数'
++++++++++++'方式二'++++++++++++
说明: 只'加载模块',但'不引入'任何函数
use File::Basename qw//;
use File::Basename (); -->'一个都不导入'
加载模块的'意义': 在脚本中'引入模块函数'名,可以像前面一样'使用短'名字
说明: 不导入模块的函数,'不意味着'无法使用模块的函数 --> '全名的方式'
File::Basename::direname
思考: perl哪些模块不导入就可以使用
(3)package
+++++++++++++++'package'理解+++++++++++++++
1)学术理解: Perl将'变量、子程序'都存贮到一个'符号表'中,Perl符号表中名字的集合就是package
好处: 通过声明 "package" 名字来获得一个'名字空间',这将确保'模块中的方法与变量',和'调用他们的代码'所'分隔'开来
3)perl文件'缺省包' --> 'main包'
package main;
++++++++++++关于'package'的两个'使用原则'++++++++++++
1)perl脚本(.pl)必须'不能包含'包的声明
2)perl模块(.pm)必须'只能声明一个包',并且对应'文件名'必须与'包名'相同
二 多行注释
=pod
# 多行注释
=cut
# 单行注释
__END__
# 忽略后面的代码
四 参考博客
Perl中的符号 ->;、=>; 和 :: 分别表示什么意思?
五 特殊关键字和符号
package, main, require, use, Exporter, EXPORT, EXPORT_OK, EXPORT_TAG,了解@INC, %INC, require, use, do