PERL物件程式設計基礎(轉)

post0發表於2007-08-10
PERL物件程式設計基礎(轉)[@more@]

[日記文]PERL面象物件程式設計基礎----引用(指標)[BASIC PART I]

writer:demonalex

email:demonalex_at_hacker.com.cn

此文的內容是PERL物件程式設計的基礎,希望各位能弄懂。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

首先說說引用(reference),它有點類似C的指標,看看下面例子:

------------------------

#!usr/bin/perl -w

#c: est4.pl

$a='aaa'; #定義變數$a,附入值為字串aaa

$b=$a; #定義變數$b,其值為變數$a的地址

print"$b "; #列印$b到STDOUT

exit 1; #退出程式

輸出結果:

C:>perl test4.pl

SCALAR(0x1af2f6c)

解說一下上面顯示的返回值,SCALAR(0x1af2f6c),'SCALAR'表示此地址所儲存的原始值為Perl

普通變數('$'),而'0x1af2f6c'表示地址值。

------------------------

從上例可以看到使用''(反斜槓運算子)可以建立引用變數(指標變數)。

若要將引用變數地址所在的儲存區的內容讀取,可以使用以下兩種方法:

1)間接引用,也就是在引用變數前加上相應的型別符號,例子:

------------------------

#!usr/bin/perl -w

#c: est5.pl

$a='aaa'; #定義變數$a,附入值為字串aaa

$b=$a; #定義變數$b,其值為變數$a的地址

$c=$$b; #定義變數$c,其值為指標變數$b的儲存區內容

print"$c "; #列印$c到STDOUT

exit 1; #退出程式

輸出結果:

C:>perl test5.pl

aaa

------------------------

所以以後凡是看到有$(實變數符號)、@(陣列符號)、%(雜湊陣列符號)後跟著一個變數的話,那麼跟在

後面的那一個變數就一定是一個引用指標變數了,而整個數值的本身就是一個轉化過程,如:%$abc,此

數值本身代表了一個雜湊陣列,而數值的儲存地址為$abc。

2)只二種方法只適用於陣列與雜湊陣列。舉兩個簡單例子:

------------------------

#!usr/bin/perl -w

#c: est6.pl

@a=('a','b','c'); #定義陣列a,其成員值均為字串,分別為'a'、'b'、'c'

$b=@a; #將陣列a的地址值負給指標變數$b

$c=$b->[0]; #使用'->'符號讀取其地址的第一個值

print"$c "; #列印$c到STDOUT

print"$b "; #列印$b到STDOUT

exit 1; #退出程式

輸出結果:

C:>perl test6.pl

a

ARRAY(0x1af2f58)

'ARRAY'為陣列,'0x1af2f58'為其地址值。

------------------------

#!usr/bin/perl -w

#c: est7.pl

%a=(first=>'hi',second=>'hello',third=>'ok'); #定義HASH陣列a

$b=\%a; #將HASH陣列a的地址值負給指標變數$b

$c=$b->{second}; #使用'->'符號讀取其地址的第一個值

print"$c "; #列印$c到STDOUT

print"$b "; #列印$b到STDOUT

exit 1; #退出程式

輸出結果:

C:>perl test7.pl

hello

HASH(0x1af2f58)

'HASH'表示雜湊陣列,'0x1af2f58'為其地址值。

------------------------

從以上兩個例子可以看出,此方法的主要特點就是使用'->'符號來讀取陣列與HASH陣列的元素。

最後做多一個實驗:

------------------------

#!usr/bin/perl -w

#c: est8.pl

$a={first=>'aaa',second=>'bbb',third=>'ccc'}; #將一個HASH陣列負值給變數$a

$b=$a->{second}; #將$a地址變數中的second標式所對應的內容值負給變數$b

print"$b "; #列印變數$b到STDOUT

print"$a "; #列印變數$a到STDOUT

exit 1; #退出程式

輸出結果:

C:>perl test8.pl

bbb

HASH(0x1aff0f8)

------------------------

樓上的例項不難看出,直接使用指標變數作陣列或HASH陣列的負值物件也是可以的,此方法還可以

達到匿名負值的效果。不過要注意,平常的負值格式應該是:%a=(first=>'aaa',second=>'bbb',third=>'ccc');,

負值時用的是小括號,而這裡負值時必須用大括號,用於表示此地址所在的內容值為HASH陣列(那如果

是陣列當然就要用中括號了)。樓上例子可以這樣理解:將某一陣列或HASH陣列負給一個變數時,變數的值

便為該陣列或HASH陣列的起此地址,一但使用了'->'符號加標式符,就可以讀取其內容中標式所對應的

值。此用法的理解與C語言的指標相當。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

最近‘浮生事’太多,忙不過來,這篇爛文用了整整2-3天才完成,真是‘罪過,罪過.......’。

[日記文]PERL面象物件程式設計基礎----物件[BASIC PART II]

writer:demonalex

email:demonalex_at_hacker.com.cn

繼續上文介紹的內容----引用(指標),可以這樣理解,其實物件(object)本身也是一個

引用。物件的本身只不過是被某‘塊’預先定義了的引用地址變數,打個比方,有某物件名

曰$aaa,它是一個被‘神聖化’(這裡神聖化的簡潔意思是被強行定義的,可以這樣理解)的

HASH陣列,要讀取其中標籤為‘who’的值,就是:

$aaa->{who};

可以看到,其與引用中讀取不規則地址值中的標籤的量所使用的方法是一樣的。可以說物件和

指標量是一樣的,唯一最大的不同在於物件擁有‘方法’(method)。方法就像是個個體以下的

一個子程式,格式如:

$object->record();

'$object'是物件,'record()'是方法,它們之間使用'->'符號聯絡起來。

完整的物件呼叫格式應該是:

模組名::物件名->方法名(引數1,引數2,......);

關於上面格式的講解:

模組名為建立此物件所在的模組的名字;物件名為此物件的名稱;方法名為需要呼叫的方法的

名稱;當此方法呼叫不需要引數時,小括號可以省略。

問:如何在程式中構造一個物件呢?

答:首先必須在程式中使用一個建構函式new()。其'基本'呼叫法則如下:

$object=模組名::基類物件->new();

當然,以上的‘模組名::基類物件’部分是可以巢狀呼叫。

最後做個例項吧:

----------------------------------------------------------

#!usr/bin/perl -w

#c: est22.pl

use IO::Socket; #匯入IO::Socket模組

$host=$ARGV[0]; #程式執行時的第一個引數負值於變數$host

$port=$ARGV[1]; #程式執行時的第二個引數負值於變數$port

$aaa=IO::Socket::INET->new("$host:$port"); #新建一個SOCKET物件$aaa,引數為'伺服器:埠',預設為TCP連線

$bbb=$aaa->getline(); #從SOCKET中讀取一行並負值給變數$bbb

chop($bbb); #剪去變數$bbb最後的結尾符號

print"$bbb "; #把變數$bbb列印到STDOUT

$aaa->close; #關閉SOCKET物件$aaa

exit 1; #退出程式

#以上程式可以讀取某伺服器中的某個處出accept()的SOCKET中的一行

#格式:perl c: est22.pl 伺服器名 埠名

----------------------------------------------------------

PS:由於程式要使用SOCKET物件程式設計,所以必須在程式開頭時使用use語句把'IO::Socket'模組調

入程式。一開始偶把'IO::Socket'寫成了'IO::SOCKET',結果執行時不停地提示找不到相應的

模組,嚇得偶頓時出了身冷汗。這個‘故事’提醒我們大小寫是很重要的......相信*NIX的使

用者是不會犯這樣的錯誤吧......:P

[日記文]PERL面象物件程式設計基礎----IO::File與IO::Handle[BASIC PART III]

writer:demonalex

email:demonalex_at_cnean.net

這次所說的IO::File與IO::Handle模組就是PERL I/O物件程式設計的基礎,學習它們的語法有助於更快地

瞭解PERL物件程式設計。這篇文章內容還是以介紹方法居多。

IO::Handle為通用控制程式碼模組(包括檔案控制程式碼、管道控制程式碼、SOCKET控制程式碼);IO::File更針對於檔案語柄。

註明:IO::File是IO::Handle的子類,繼承了IO::Handle的所有方法,並且還加入了兩個自己獨有的方法:

new()與new_tmpfile()。

下面是兩個主要模組的所有方法呼叫:

****************************************************************************************************************

-------------------------------------------------------------------------------------------------

$handle=IO::File->new($filename[,$mode[,$perms]]);

開啟一個檔案控制程式碼。單引數使用時與open()的使用方法相當。引數$mode為開啟此檔案管道的模式,其值可

以是八進位制字元,也可以是典型的檔案控制程式碼符號。引數$perms用於設定開啟此檔案控制程式碼的許可權,其值為八進

制字元。建議還是使用單引數方式比較簡潔,如:

$handle=IO::File->new(">c:dark2s.txt"); #單引數呼叫

#or

$handle2=IO::File->new("c:demonalex.txt",">"); #雙引數呼叫

-------------------------------------------------------------------------------------------------

$handle=IO::File->new_tmpfile;

此方法呼叫無需要引數,故後面的小括號對省略。其呼叫後會在系統中生成一個臨時的匿名檔案,用於讀寫

操作的緩衝用,主要是用於*nix系統。

-------------------------------------------------------------------------------------------------

$result=$handle->close;

無引數,用於關閉物件。若呼叫成功其返回值$result為‘真’。

-------------------------------------------------------------------------------------------------

$result=$handle->open($filename[,$mode[,$perms]]);

此方法的所有引數與new方法的引數呼叫完全相同。呼叫此方法的目的是為了重新開啟一個檔案控制程式碼,返回值

$result為布林值。

-------------------------------------------------------------------------------------------------

$result=$handle->print(@args);

寫入控制程式碼方法,使用格式與STDOUT的print輸出相當。引數為輸出字串,返回值$result為布林值。

-------------------------------------------------------------------------------------------------

$result=$handle->printf($fmt,@args);

格式化寫入控制程式碼方法,使用格式與STDOUT的printf輸出相當。第一個引數為輸出格式,後跟輸出的字串,返

回值$result為布林值。

-------------------------------------------------------------------------------------------------

$bytes=$handle->write($data[,$length[,$offset]]);

呼叫方式與呼叫引數與STDOUT的write()呼叫相同,返回值為成功寫控制程式碼位元組數。

-------------------------------------------------------------------------------------------------

$bytes=$handle->syswrite($data[,$length[,$offset]]);

呼叫方式與呼叫引數與STDOUT的syswrite()呼叫相同,不過使用了stdio快取,返回值為成功寫控制程式碼位元組數。

-------------------------------------------------------------------------------------------------

$line=$handle->getline;

從控制程式碼變數$handle中讀取一行,將其值負值於返回值$line。無引數,效果等同於STDIN的'<>'符號。

-------------------------------------------------------------------------------------------------

@line=$handle->getlines;

從控制程式碼變數$handle中讀取所有行,將其值負值於返回陣列@line。無引數,效果等同於:

@line= #HANDLE為控制程式碼

-------------------------------------------------------------------------------------------------

$bytes=$handle->read($buffer,$length[,$offset]);

呼叫方式與呼叫引數與STDOUT的read()呼叫相同,返回值為成功讀控制程式碼位元組數。

-------------------------------------------------------------------------------------------------

$bytes=$handle->sysread($buffer,$length[,$offset]);

呼叫方式與呼叫引數與STDOUT的sysread()呼叫相同,返回值為成功讀控制程式碼位元組數。

-------------------------------------------------------------------------------------------------

$previous=$handle->autoflush([$boolean]);

開啟autoflush模式,也就關閉讀寫快取模式。引數為布林值,無引數時預設為開啟autoflush模式。返

回值為呼叫此方法前的前一個狀態。

-------------------------------------------------------------------------------------------------

$boolean=$handle->opened;

此方法用於測試物件是否被開啟了(也就是測試這個控制程式碼是否有效),返回值為布林值。此方法的呼叫等同於:

defined fileno($handle);

-------------------------------------------------------------------------------------------------

$boolean=$handle->eof;

無引數,用於測試讀取指標是否控制程式碼的盡頭,返回值為布林值。

-------------------------------------------------------------------------------------------------

$handle->flush;

呼叫此方法將使程式的快取資料立即‘湧出’。無引數,無返回值。

-------------------------------------------------------------------------------------------------

$boolean=$handle->block([$boolean]);

用於控制控制程式碼阻塞模式的開與關。引數為布林值,無引數時預設為開啟阻塞模式,其返回值亦為布林值。

-------------------------------------------------------------------------------------------------

$handle->clearerr;

無引數,無返回值。用於清除$handle控制程式碼物件在呼叫過程中出現錯誤產生的錯誤標誌。

-------------------------------------------------------------------------------------------------

$boolean=$handle->error;

無引數,呼叫此方法後,從$handle控制程式碼物件的建立到此控制程式碼物件從記憶體中卸下的整個過程中若出現了錯誤,則

呼叫此方法的返回值就會為1。此方法其實是一個檢查$handle控制程式碼物件在呼叫過程有沒有發生錯誤的方法。

-------------------------------------------------------------------------------------------------

$handle=IO::File->new_from_fd($handle,$mode);

呼叫此方法用於生成複製控制程式碼物件。第一個引數為被複製的源控制程式碼物件,第二個引數為控制程式碼運算子,返回值為

複製的目標控制程式碼物件。

-------------------------------------------------------------------------------------------------

$result=$th->fdopen($handle,$mode);

用於重新開啟一個已存在的控制程式碼物件,第一個引數為控制程式碼物件名,第二個引數為控制程式碼運算子,返回值為布林

值。

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

相關文章