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

yhou31發表於2015-05-14
==================================包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=) {
  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;
  •     如何使用模組
模組檔案必須先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';

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9950964/viewspace-1654433/,如需轉載,請註明出處,否則將追究法律責任。

相關文章