设为首页 收藏本站
查看: 826|回复: 0

[经验分享] perl module and its package

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-12-26 08:20:25 | 显示全部楼层 |阅读模式
  ==================================包package===========================


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

    包文件——包是面向对象的概念
#!/usr/bin/perl
packagexxx;           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了其它的包,当你想切换回去使用缺省的符号表,可以重新指定packagemain;
   这样,接下来的程序就好象从没定义过包一样

   包文件和模块文件都是.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
$

    在Perl5中,可以用package;   指定无当前包, 这时,所有的变量必须明确指出所属包名,否则报错
package;   
$var = 21;
#error - no current package
  改正
package;
$mypack::var = 21;

   包造成的私有变量和方法:保证包的变量不可在其它地方使用,这样的数据即为私有数据。
1 : packageprivpack;
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;


  •     RequireExporter
require Exporter;
@ISA = qw(Exporter);


  •    定义@EXPORT和@EXPORT_OK

  • sub赋值给数组@EXPORT数组后,就能被其他文件调用,否则,在模块中定义但没有赋给数组@EXPORT的sub都是私有的,只能在模块内部调用

  • @EXPORT_OK 定义能被其他文件调用的变量(全局变量),不在这个数组中的变量也是私有变量,则出不了模块文件。
@EXPORT = qw(readfilecheckfile 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 wrongformat\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:
[iyunv@localhost perltest]# cptestdir/file1.pm /usr/lib/perl5/5.8.6/

[iyunv@localhost perltest]# exit
exit


  •    在perl编程中使用模块
[macg@localhost perltest]$ vi tip.pl
#!/usr/bin/perl
usefile1;             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;
[iyunv@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/)


   预定义模块的导入和导出
    Perl5提供了许多有用的预定义模块,可以用use导入和no语句取消。
integer       使用整数运算
Diagnostics   输出较多的诊断信息(警告)
English      允许英文名用作系统变量的别名
Env          导入环境变量的Perl模块
POSIX        POSIX标准(IEEE1003.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 官方模块
[iyunv@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

[iyunv@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)=@_;
useFile::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 ArchiveNetwork)
安裝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
useDBI;                   # 宣告使用 DBI module內的所有"方法"
my $db="test";
my $host='localhost';
my $user='root';
my $password='ppp123';

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156391-1-1.html 上篇帖子: Perl字符贪吃蛇 下篇帖子: 【Perl】二维数组
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表