Loading [MathJax]/jax/element/mml/optable/BasicLatin.js

perl学习之:package and module

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
mypackline=10;ormypack::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:packagepack2;6:var = 34;
7: package pack1;
8: print ("$var\n");
./tip.pl26

    在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(myvar1myvar2);
  •    具体的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';
posted @   CHIPER  阅读(905)  评论(0编辑  收藏  举报
编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· C# 13 中的新增功能实操
· Vue3封装支持Base64导出的电子签名组件
· 万字长文详解Text-to-SQL
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
点击右上角即可分享
微信分享提示