perl的包(package)和模块(PM)

==================================包package===========================
     package mypack;  包文件的其始语句
此语句定义一个名为mypack的包,从此以后定义的所有变量和sub的名字都存贮在该包关联的符号表中,直到遇到另一个package语句为止。

包文件——包是面向对象的概念

#!/usr/bin/perl
package xxx;            package指令创建“类”;

sub ...                 创建sub就是创建“类”的“方法”
sub ...
sub ...

1;    包文件结尾要retrun 1

包(类)引用:

&mypack'printval(); 在包mypack外调用包内sub
$mypack'line=10;
or
$mypack::line=10;
在包mypack外调用包内变量

perl5中建议$mypack::var
单引号引用的方式仍然支持,但将来的版本中未必支持

perl文件缺省包——main包

#!/usr/bin/perl

$i=0;

sub gotest {

}  

 等价 #!/usr/bin/perl
package main;
$i=0;

sub gotest {

}

如果在程序里package了其它的包,当你想切换回去使用缺省的符号表,可以重新指定package main;
    这样,接下来的程序就好象从没定义过包一样

包文件和模块文件都是.pm
其中模块文件,文件名必须与package 名相同

在程序里可以随时在包间来回切换

1: #!/usr/local/bin/perl
2:
3: package pack1;
4: $var = 26;
5: package pack2;
6: $var = 34;
7: package pack1;
8: print ("$var\n");
$ ./tip.pl
26
$

在Perl 5中,可以用package;    指定无当前包, 这时,所有的变量必须明确指出所属包名,否则报错

package;   
$var = 21;
 #error - no current package

改正

package; 
$mypack::var = 21;

包造成的私有变量和方法:保证包的变量不可在其它地方使用,这样的数据即为私有数据。

1 : package privpack;
2 : $valtoprint = 46;
3 :
4 : package main;
5 : # This function is the link to the outside world.
6 : sub printval {
7 :   &privpack'printval();  
8 : }
9 :
10: package privpack;
11: sub printval {
12:   print ("$valtoprint\n");   只有同一个包中,才能“直接”调用此变量,其他包中调用此变量要带::前缀或切换package ...
13: }
14:
15: package main;

16: 1; 

=============================================模块===============================

包package和模块module有什么不同?
创建包并将之存在同名的文件中,就是模块。

模块的创建和使用

  • 创建包文件,要求文件名为”包名.pm”(和里面的package “包名”同名)
vi file1.pm
#!/usr/local/bin/perl
package file1;
  • Require Exporter
require Exporter;
@ISA = qw(Exporter);
  • 定义@EXPORT和@EXPORT_OK
  1. sub 赋值给数组@EXPORT数组后,就能被其他文件调用,否则,在模块中定义但没有赋给数组@EXPORT的sub都是私有的,只能在模块内部调用
  1. @EXPORT_OK  定义能被其他文件调用的变量(全局变量),不在这个数组中的变量也是私有变量,则出不了模块文件。
@EXPORT = qw(readfile checkfile gotest);
# @EXPORT_OK = qw($myvar1 $myvar2);
  • 具体的sub和全局变量定义
sub readfile{
my(@tmp)=@_;
my($line);
open (MYFILE, $tmp[0]) || die ("Could not open file");
while ($line=<MYFILE>) {
  print $line;
  }
}

sub checkfile{
my(@tmp)=@_;
open (MYFILE, $tmp[0]) || die ("Could not open file");
my($line,$pattern,$lamp);
$pattern=$tmp[1];
$lamp=0;
while (chomp($line=<MYFILE>)) {
  if($line!~/$pattern/) {
  print "[$line ] :this line is wrong format\n";
  $lamp=1;
                          }
                       }
if($lamp) { print "\n",$tmp[2],"\n";}

close(MYFILE);
}

sub gotest{
my(@tmp)=@_;

open (MYFILE, $tmp[0]) || die ("Could not open file");
my($line,$newline);
while ($line=<MYFILE>) {
$line=~ tr/a-zA-Z//s;
  print "good \n";
  print "\$line is :$line";
  print "\$\& is : $&", "\n";
  }

close(MYFILE);
}

  • 文件结束要return 1;
1;
  • 如何使用模块

模块文件必须先cp到perl的库目录下,才能被use

[macg@localhost perltest]$ ls testdir
file1.pl  file1.pm  test1
[macg@localhost perltest]$ su
Password:
[root@localhost perltest]# cp testdir/file1.pm /usr/lib/perl5/5.8.6/

[root@localhost perltest]# exit
exit

  • 在perl编程中使用模块
[macg@localhost perltest]$ vi tip.pl
#!/usr/bin/perl
use file1;              use 模块

$file="/home/macg/perltest/gogo";
$pattern="\^\\d+\\.\\d+\\.\\d+\\.\\d+\$";
&readfile($file);           直接调用模块中的sub
print "-----------------------------------------\n";

$pattern="\^[0-9a-z]+[\\t ]+\\d+\\.\\d+\\.\\d+\\.\\d+\$";

$message="example:hostname1    10.10.20.2";
&checkfile($file,$pattern,$message);

[macg@localhost perltest]$ ./tip.pl
host1 202.106.0.20
host2   9.89.9.1
host3           10.0.23.6
11.0.25.9
host5           12.0.1.0as
-----------------------------------------
[11.0.25.9 ] :this line is wrong format
[host5                  12.0.1.0as ] :this line is wrong format

example:hostname1    10.10.20.2

.pm文件不仅放在perl工作库目录,其实放在当前目录,也可以直接use

vi tip.pl
#!/usr/bin/perl
package main;
use file1;
[root@localhost perltest]# rm /usr/lib/perl5/5.8.6/file1.pm
rm: remove regular file `/usr/lib/perl5/5.8.6/file1.pm'? y

[macg@localhost perltest]$ ls  当前目录中
file1.pm  gogo  newdir  newtest  test  testdir  tip.pl

[macg@localhost perltest]$ ./tip.pl
host1 202.106.0.20
host2   9.89.9.1
host3           10.0.23.6   

@INC对use命令没用,它只服务于require命令,use命令直接去访问perl模块目录(比如/usr/lib/perl5/5.8.6/)

预定义模块的导入和导出
    Perl 5提供了许多有用的预定义模块,可以用use导入和no语句取消。
integer        使用整数运算
Diagnostics    输出较多的诊断信息(警告)
English       允许英文名用作系统变量的别名
Env           导入环境变量的Perl模块
POSIX         POSIX标准(IEEE 1003.1)的Perl接口   
Socket        装载C语言的套接字处理机制
  一个导入模块和取消导入的例子:

1: #!/usr/local/bin/perl
2:
3: use integer;
4: $result = 2.4 + 2.4;
integer模块要求所有数字运算基于整数,浮点数在运算前均被转化为整数。
5: print ("$result\n");
6:
7: no integer;
8: $result = 2.4 + 2.4;
9: print ("$result\n"); 
$./tip.pl
4
4.8
$

Perl文档中有完整的预定义模块列表。

use 官方模块

[root@localhost perltest]# ls -F /usr/lib/perl5/5.8.6/File
Basename.pm  CheckTree.pm  Compare.pm  Copy.pm  DosGlob.pm  Find.pm  Path.pm  Spec/  Spec.pm  stat.pm  Temp.pm

[root@localhost perltest]# ls -F /usr/lib/perl5/5.8.6/CGI
Apache.pm  Carp.pm  Cookie.pm  eg/  Fast.pm  Pretty.pm  Push.pm  Switch.pm  Util.pm

#!/usr/bin/perl
chomp($file=<>);
chomp($file2=<>);
&gotest($file,$file2);

sub gotest{
my(@tmp)=@_;
use File::Copy;    File::Copy即/usr/lib/perl5/5.8.6/File/Copy.pm

copy($tmp[0], $tmp[1]);

[macg@localhost perltest]$ ./tip.pl
test
newtest

[macg@localhost perltest]$ ls
newtest  test  testdir  tip.pl 

perldoc 查询官方模块的用法

  • 先确定perl5的lib根目录
[macg@localhost perltest]$ ls /usr/lib/perl5/5.8.6
abbrev.pl       bigrat.pm           DB.pm           Fatal.pm       I18N                     NEXT            shellwords.pl  Thread.pm
AnyDBM_File.pm  blib.pm             Devel           fields.pm      i386-linux-thread-multi  NEXT.pm         sigtrap.pm     Tie
assert.pl       bytes_heavy.pl      diagnostics.pm  File           if.pm                    open2.pl        sort.pm        Time
Attribute       bytes.pm            Digest          file1.pm       importenv.pl             open3.pl 
  • 再确定感兴趣的模块
[macg@localhost perltest]$ ls /usr/lib/perl5/5.8.6/Net
Changes.libnet  Config.eg  demos      FTP     hostent.pm   libnet.cfg     netent.pm  NNTP.pm  Ping.pm  protoent.pm    servent.pm  Time.pm
Cmd.pm          Config.pm  Domain.pm  FTP.pm  Hostname.eg  libnetFAQ.pod  Netrc.pm   Ping     POP3.pm  README.libnet  SMTP.pm
  • perldoc查询用法
[macg@localhost perltest]$ perldoc Net::FTP
                              基于perl lib根目录
NAME
       Net::FTP - FTP Client class

SYNOPSIS
           use Net::FTP;

$ftp = Net::FTP->new("some.host.name", Debug => 0)
             or die "Cannot connect to some.host.name: $@";

$ftp->login("anonymous",鈥?anonymous@鈥?
             or die "Cannot login ", $ftp->message;

$ftp->get("that.file")
             or die "get failed ", $ftp->message;

$ftp->quit;

CPAN (Comprehensive Perl Archive Network)
安裝CPAN的module

下载DBI-1.37.tar.gz

安装

tar xvzf DBI-1.37.tar.gz
cd DBI-1.37
perl Makefile.PL
make
make test
make install

使用module

#! /usr/bin/perl
use DBI;                    # 宣告使用 DBI module內的所有"方法"
my $db="test";
my $host='localhost';
my $user='root';
my $password='ppp123';

perl学习之:package and module的更多相关文章

  1. Go中的Package和Module分析

    Package 所谓package(包)其实就是代码的一种组织管理方式,代码多了就需要放入文件,文件多了就需要归类放入文件夹,就好比我们在给电脑装软件时会进行归类安装,其实也是有意无意对电脑软件安装的 ...

  2. perl的package和module

    来源: http://www.cnblogs.com/itech/archive/2010/03/23/1692836.html 一 package 1) package 相当于C++中的namesp ...

  3. perl学习笔记之:模式匹配,模块,文档

    Perl语言的最大特点,也是Perl作为CGI首选语言的最大特点,是它的模式匹配操作符.Perl语言的强大的文本处理能力正是通过其内嵌的对模式匹配的支持体现的.模式通过创建正则表达式实现.Perl的正 ...

  4. perl学习之:use and require

    本文和大家重点学习一下Perl use和require用法对比,这两个函数都是一个意思,加载和引用Perl的模块,或者是子程序,区别在于Perl use是在当前默认的里面去寻找,一旦模块不在指定的区域 ...

  5. perl学习之路1

    一切要从Hollo world开始 公司要用perl....啊, 不会只能自学了, 毕竟是公司啊, 不是学校...公司不学习就滚蛋了...惨惨惨 因为是学习嘛, 感觉开虚拟机比较麻烦所以直接用了个 瘟 ...

  6. 【Perl学习笔记】2. perl中的bless理解

    bless有两个参数:对象的引用.类的名称. 类的名称是一个字符串,代表了类的类型信息,这是理解bless的关键. 所谓bless就是把 类型信息 赋予 实例变量. 程序包括5个文件:person.p ...

  7. 【Perl学习笔记】1.perl的ref 函数

    perl有引用的概念:一组数据实际上是另一组数据的引用.这些引用称为指针,第一组数据中存放的是第二组数据的头地址.引用的方式被用得相当普遍,特别是在面向对象的模块.函数的参数传递等常见.但perl对每 ...

  8. Python package和module

    package,即包,可以把功能相近的module(模块)组织在一起,以便更好地管理.Java中也有包的概念,作用类似,是为了更好地管理类和接口.package,说白了就是个目录,不过这个目录下一定要 ...

  9. Go语言学习笔记 package

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 strings import "strings" strings包实现了用于操作字符的简单函数 ...

随机推荐

  1. P1223 [小数据版]边权差值最小的生成树

    这道题和最小生成树kruskal的代码几乎相同,只不过不一定是最小生成树,所以不一定从最短的边开始做生成树:所以将每一条边分别作为起点,然后枚举就行了...... #include <bits/ ...

  2. Hdu 4513 吉哥系列故事——完美队形II (manacher变形)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4513 题目描述: 打完题目描述了,点开题目,发现题目是中文,orz.jpg.果断又删掉了,习惯真可怕 ...

  3. Vue项目搭建流程 以及 目录结构构建

    Vue项目搭建流程 以及 目录结构构建 一个小的Vue项目, 基于微信浏览器的移动端, 做了这么多的练习项目, 这一次准备记录下构建的过程, 以方便以后的调高效率 环境准备 操作系统 我的 windo ...

  4. 牛客国庆集训派对Day_1~3

    Day_1 A.Tobaku Mokushiroku Kaiji 题目描述 Kaiji正在与另外一人玩石头剪刀布.双方各有一些代表石头.剪刀.布的卡牌,每局两人各出一张卡牌,根据卡牌的内容决定这一局的 ...

  5. RAID基础

    磁盘类型 类型 IDE Integrated Drive Electronics SATA Srial ATA SCSI Small Computer System Interface FC Fibe ...

  6. 搭建一个高可用的redis环境

    一.环境准备 我的环境: Fedora 25 server  64位版 6台: 192.168.10.204 192.168.10.205 192.168.10.206 192.168.10.203 ...

  7. 【转】java节省内存的几条建议

    下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方. 1. 尽量在合适的场合使用单例   使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单 ...

  8. jQuery中面向对象思想实现盒子内容切换

    这里主要是模拟小米官网中的首页的内容模块实现的主要动态效果 布局:采用了bootstrap框架进行布局,及其其中的字体图标 html: <!-- 内容 --> <div class= ...

  9. BigDecimal取余运算

    取余运算在编程中运用非常广泛,对于BigDecimal对象取余运算可以通过divideAndRemainder方法实现. public BigDecimal[] divideAndRemainder( ...

  10. laravel之伪造跨站请求保护CSRF实现机制

    Laravel 提供了简单的方法使你的应用免受 跨站请求伪造 (CSRF) 的袭击.跨站请求伪造是一种恶意的攻击,它凭借已通过身份验证的用户身份来运行未经过授权的命令. Laravel 为每个活跃用户 ...