Perl(十九)Perl模块继续探究

一    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

perl 符号表

+++++++++++++++'package'理解+++++++++++++++

1)学术理解: Perl将'变量、子程序'都存贮到一个'符号表'中,Perl符号表中名字的集合就是package

好处: 通过声明 "package" 名字来获得一个'名字空间',这将确保'模块中的方法与变量',和'调用他们的代码'所'分隔'开来

3)perl文件'缺省包' --> 'main包'

package main;
​
++++++++++++关于'package'的两个'使用原则'++++++++++++

1)perl脚本(.pl)必须'不能包含'包的声明

2)perl模块(.pm)必须'只能声明一个包',并且对应'文件名'必须与'包名'相同

参考博客1

包的深入了解

require和use的区别

perl lib 用法

二    多行注释

=pod

#  多行注释

=cut

#  单行注释

__END__

#  忽略后面的代码

四   参考博客 

Perl中的符号 ->;、=>; 和 :: 分别表示什么意思?

Perl中的特殊符号介绍

perl变量作用域--local,my,our

五   特殊关键字和符号

package, main, require, use, Exporter, EXPORT, EXPORT_OK, EXPORT_TAG,了解@INC, %INC, require, use, do

双下划线的斜杠 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值