perl的包(package)和模組(PM)
==================================包package===========================
package mypack; 包檔案的其始語句
此語句定義一個名為mypack的包,從此以後定義的所有變數和sub的名字都存貯在該包關聯的符號表中,直到遇到另一個package語句為止。
包檔案——包是物件導向的概念
包(類)引用:
perl檔案預設包——main包
如果在程式裡package了其它的包,當你想切換回去使用預設的符號表,可以重新指定package main;
這樣,接下來的程式就好象從沒定義過包一樣
包檔案和模組檔案都是.pm
其中模組檔案,檔名必須與package 名相同
在程式裡可以隨時在包間來回切換
在Perl 5中,可以用package; 指定無當前包, 這時,所有的變數必須明確指出所屬包名,否則報錯
改正
包造成的私有變數和方法:保證包的變數不可在其它地方使用,這樣的資料即為私有資料。
=============================================模組===============================
包package和模組module有什麼不同?
建立包並將之存在同名的檔案中,就是模組。
模組的建立和使用
.pm檔案不僅放在perl工作庫目錄,其實放在當前目錄,也可以直接use
@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語言的套接字處理機制
一個匯入模組和取消匯入的例子:
Perl文件中有完整的預定義模組列表。
use 官方模組
perldoc 查詢官方模組的用法
CPAN (Comprehensive Perl Archive Network)
安裝CPAN的module
安裝
使用module
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
-
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= 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= 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= $line=~ tr/a-zA-Z//s; print "good \n"; print "\$line is :$line"; print "\$\& is : $&", "\n"; } close(MYFILE); } |
- 檔案結束要return 1;
1; |
- 如何使用模組
[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 $ |
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 |
#! /usr/bin/perl use DBI; # 宣告使用 DBI module內的所有"方法" my $db="test"; my $host='localhost'; my $user='root'; my $password='ppp123'; |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9950964/viewspace-1654433/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python的包(package)和模組(module)介紹PythonPackage
- SAP PM 入門系列14 – PM模組與其它模組的整合
- 模組和包
- Python包和模組管理Python
- 9.模組和包
- pipenv管理模組和包
- SAP PM 入門系列9 – PM模組的User-Exits & BADIs
- python包和模組的內容整理Python
- rust學習八、包和模組Rust
- 第十三章 模組和包
- 模組與包
- Python - 模組包Python
- 全網最適合入門的物件導向程式設計教程:21 類和物件的 Python 實現-多檔案的組織:模組 module 和包 package物件程式設計PythonPackage
- npm模組管理-區分測試包和穩定包NPM
- python模組與包Python
- Python - 模組與包Python
- 跨包引用模組
- Python包與模組Python
- Python中的類、模組和包究竟是什麼?Python
- Python基礎入門(8)- Python模組和包Python
- 使用了一下perl的XML::Smart模組,真是太好用了XML
- Python案例學習——模組和包、爬蟲的基礎概念Python爬蟲
- 關於Python包和模組的10個知識清單Python
- CommonJS模組 和 ECMAScript模組JS
- day21:正則函式&模組和包(import)函式Import
- npm入門(二)—package(包)的管理NPMPackage
- 如何釋出自己的NPM包(模組)?NPM
- 黑馬PM- B端產品-客服模組設計
- pip 命令安裝模組包
- 2. 指令碼、模組、包指令碼
- Go語言之包(package)管理GoPackage
- python常用標準庫(壓縮包模組zipfile和tarfile)Python
- Python類、模組、包的概念及區別Python
- 2-2 Go語言的包(package)GoPackage
- Python中的包模組引用成員的方法Python
- 黑馬PM- B端產品-銷售模組設計
- 黑馬PM- B端產品-倉儲模組設計
- 黑馬PM- B端產品-工單模組設計
- 黑馬PM- B端產品-質檢模組設計