perl学习之:package and module
perl的包(package)和模块(PM)
==================================包package===========================
package mypack; 包文件的其始语句
此语句定义一个名为mypack的包,从此以后定义的所有变量和sub的名字都存贮在该包关联的符号表中,直到遇到另一个package语句为止。
包文件——包是面向对象的概念
| #!/usr/bin/perl package xxx; package指令创建“类”; 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
- sub 赋值给数组@EXPORT数组后,就能被其他文件调用,否则,在模块中定义但没有赋给数组@EXPORT的sub都是私有的,只能在模块内部调用
- @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{ close(MYFILE); sub gotest{ open (MYFILE, $tmp[0]) || die ("Could not open file"); 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 |
- 在perl编程中使用模块
| [macg@localhost perltest]$ vi tip.pl #!/usr/bin/perl use file1; use 模块 $file="/home/macg/perltest/gogo"; $pattern="\^[0-9a-z]+[\\t ]+\\d+\\.\\d+\\.\\d+\\.\\d+\$"; $message="example:hostname1 10.10.20.2"; |
| [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 当前目录中 |
| [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 |
| #!/usr/bin/perl chomp($file=<>); chomp($file2=<>); &gotest($file,$file2); sub gotest{ copy($tmp[0], $tmp[1]); |
| [macg@localhost perltest]$ ./tip.pl test newtest [macg@localhost perltest]$ ls |
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 $ftp = Net::FTP->new("some.host.name", Debug => 0) $ftp->login("anonymous",鈥?anonymous@鈥? $ftp->get("that.file") $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的更多相关文章
- Go中的Package和Module分析
Package 所谓package(包)其实就是代码的一种组织管理方式,代码多了就需要放入文件,文件多了就需要归类放入文件夹,就好比我们在给电脑装软件时会进行归类安装,其实也是有意无意对电脑软件安装的 ...
- perl的package和module
来源: http://www.cnblogs.com/itech/archive/2010/03/23/1692836.html 一 package 1) package 相当于C++中的namesp ...
- perl学习笔记之:模式匹配,模块,文档
Perl语言的最大特点,也是Perl作为CGI首选语言的最大特点,是它的模式匹配操作符.Perl语言的强大的文本处理能力正是通过其内嵌的对模式匹配的支持体现的.模式通过创建正则表达式实现.Perl的正 ...
- perl学习之:use and require
本文和大家重点学习一下Perl use和require用法对比,这两个函数都是一个意思,加载和引用Perl的模块,或者是子程序,区别在于Perl use是在当前默认的里面去寻找,一旦模块不在指定的区域 ...
- perl学习之路1
一切要从Hollo world开始 公司要用perl....啊, 不会只能自学了, 毕竟是公司啊, 不是学校...公司不学习就滚蛋了...惨惨惨 因为是学习嘛, 感觉开虚拟机比较麻烦所以直接用了个 瘟 ...
- 【Perl学习笔记】2. perl中的bless理解
bless有两个参数:对象的引用.类的名称. 类的名称是一个字符串,代表了类的类型信息,这是理解bless的关键. 所谓bless就是把 类型信息 赋予 实例变量. 程序包括5个文件:person.p ...
- 【Perl学习笔记】1.perl的ref 函数
perl有引用的概念:一组数据实际上是另一组数据的引用.这些引用称为指针,第一组数据中存放的是第二组数据的头地址.引用的方式被用得相当普遍,特别是在面向对象的模块.函数的参数传递等常见.但perl对每 ...
- Python package和module
package,即包,可以把功能相近的module(模块)组织在一起,以便更好地管理.Java中也有包的概念,作用类似,是为了更好地管理类和接口.package,说白了就是个目录,不过这个目录下一定要 ...
- Go语言学习笔记 package
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 strings import "strings" strings包实现了用于操作字符的简单函数 ...
随机推荐
- springcloud(一) 服务拆分
一般我们的项目如果需要从单应用服务升级到微服务,必须要将原来的服务做拆分,我这边的拆分也是基于将之前spb-demo的springboot单应用做拆分,拆分出三个应用,spb-brian-query- ...
- PJzhang:微信公众号短连接与微信好友验证
猫宁!!! 参考链接:https://mp.weixin.qq.com/s/LPuYrDEyEXHyhcK3_HokSg 之前看到他们有人把微信公众号文章的长链接转为短链接,很受用,百度搜索一下方法, ...
- 第五篇 .NET高级技术之CTS、CLS、CLR
CTS.CLS.CLR 1. .Net平台下不只有C#语言,还有VB.Net.F#等语言.IL是程序最终编译的可以执行的二进制代码(托管代码),不同的语言最终都编译成标准的IL(中间语言,MSIL): ...
- Luogu P4889 kls与flag 【思维/排序】By cellur925
题目传送门 这题真的一点也不难qwq.只要想出来就没有什么代码难度的qwq. 每个竹竿只可能向左倒或向右倒,把这两种情况都存在数组中,将数组排序,就可以知道最后落在同一位置的有多少竹竿.就可以知道落在 ...
- MySql | 常用操作总结
创建数据库: CREATE DATABASE 数据库名; 删除数据库名: drop database <数据库名>; 选择数据库: use 数据库名; 创建数据表: CREATE TABL ...
- C++构造函数与析构函数的解析
创建一个对象时,常常需要作某些初始化的工作,例如对数据成员赋初值. 注意,类的数据成员是不能在声明类时初始化的.如果一个类中所有的成员都是公用的,则可以在定义对象时对数据成员进行初始化.如: clas ...
- spark block读写流程分析
之前分析了spark任务提交以及计算的流程,本文将分析在计算过程中数据的读写过程.我们知道:spark抽象出了RDD,在物理上RDD通常由多个Partition组成,一个partition对应一个bl ...
- [转].NET 4 并行(多核)编程系列之二 从Task开始
本文转自:http://www.cnblogs.com/yanyangtian/archive/2010/05/22/1741379.html .NET 4 并行(多核)编程系列之二 从Task开始 ...
- vue在使用ajax获取数据时,两种方法(jquery和vue_resource)
@{ Layout = null;} <!DOCTYPE html> <html><head> <meta name="viewport ...
- Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bhive.session.id%7D_resources
原因:环境变量设置问题 <property> <name>Hive.exec.local.scratchdir</name> <value> ...