PERL物件程式設計基礎(轉)
PERL物件程式設計基礎(轉)[@more@][日記文]PERL面象物件程式設計基礎----引用(指標)[BASIC PART I]writer:demonalexemail: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到STDOUTexit 1; #退出程式輸出結果:C:>perl test4.plSCALAR(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到STDOUTexit 1; #退出程式輸出結果:C:>perl test5.plaaa------------------------所以以後凡是看到有$(實變數符號)、@(陣列符號)、%(雜湊陣列符號)後跟著一個變數的話,那麼跟在後面的那一個變數就一定是一個引用指標變數了,而整個數值的本身就是一個轉化過程,如:%$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到STDOUTprint"$b
"; #列印$b到STDOUTexit 1; #退出程式輸出結果:C:>perl test6.plaARRAY(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到STDOUTprint"$b
"; #列印$b到STDOUTexit 1; #退出程式輸出結果:C:>perl test7.plhelloHASH(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標式所對應的內容值負給變數$bprint"$b
"; #列印變數$b到STDOUTprint"$a
"; #列印變數$a到STDOUTexit 1; #退出程式輸出結果:C:>perl test8.plbbbHASH(0x1aff0f8)------------------------樓上的例項不難看出,直接使用指標變數作陣列或HASH陣列的負值物件也是可以的,此方法還可以達到匿名負值的效果。不過要注意,平常的負值格式應該是:%a=(first=>'aaa',second=>'bbb',third=>'ccc');,負值時用的是小括號,而這裡負值時必須用大括號,用於表示此地址所在的內容值為HASH陣列(那如果是陣列當然就要用中括號了)。樓上例子可以這樣理解:將某一陣列或HASH陣列負給一個變數時,變數的值便為該陣列或HASH陣列的起此地址,一但使用了'->'符號加標式符,就可以讀取其內容中標式所對應的值。此用法的理解與C語言的指標相當。━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━最近‘浮生事’太多,忙不過來,這篇爛文用了整整2-3天才完成,真是‘罪過,罪過.......’。[日記文]PERL面象物件程式設計基礎----物件[BASIC PART II]writer:demonalexemail: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.pluse 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中讀取一行並負值給變數$bbbchop($bbb); #剪去變數$bbb最後的結尾符號print"$bbb
"; #把變數$bbb列印到STDOUT$aaa->close; #關閉SOCKET物件$aaaexit 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:demonalexemail: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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- perl 物件導向程式設計物件程式設計
- [.net 物件導向程式設計基礎] (4) 基礎中的基礎——資料型別轉換物件程式設計資料型別
- [.net 物件導向程式設計基礎] (19) LINQ基礎物件程式設計
- [.net 物件導向程式設計基礎] (2) 關於物件導向程式設計物件程式設計
- python物件導向程式設計基礎Python物件程式設計
- python基礎(物件導向程式設計)Python物件程式設計
- JAVA基礎:使用Java開始物件導向的程式設計(轉)Java物件程式設計
- mod_perl 程式設計介紹 (轉)程式設計
- perl 基礎
- [.net 物件導向程式設計基礎] (16) 介面物件程式設計
- [.net 物件導向程式設計基礎] (22) 事件物件程式設計事件
- [.net 物件導向程式設計基礎] (8) 基礎中的基礎——修飾符物件程式設計
- Javascript基礎與物件導向基礎~第一講啥叫程式設計,啥叫程式設計師JavaScript物件程式設計師
- 第十三章 Perl的物件導向程式設計物件程式設計
- perl 程式設計利器程式設計
- perl程式設計技巧程式設計
- [.net 物件導向程式設計基礎] (5) 基礎中的基礎——變數和常量物件程式設計變數
- [.net 物件導向程式設計基礎] (3) 基礎中的基礎——資料型別物件程式設計資料型別
- [.net 物件導向程式設計深入](36)Redis——基礎物件程式設計Redis
- [.net 物件導向程式設計基礎] (1) 開篇物件程式設計
- [.net 物件導向程式設計基礎] (18) 泛型物件程式設計泛型
- [.net 物件導向程式設計基礎] (15) 抽象類物件程式設計抽象
- [.net 物件導向程式設計基礎] (14) 重構物件程式設計
- [.net 物件導向程式設計基礎] (21) 委託物件程式設計
- 實驗2 類和物件 基礎程式設計1物件程式設計
- 實驗2 類和物件_基礎程式設計1物件程式設計
- 實驗三 類和物件 基礎程式設計2物件程式設計
- 實驗三 類和物件_基礎程式設計2物件程式設計
- 實驗3 類和物件——基礎程式設計2物件程式設計
- 實驗3 類和物件 基礎程式設計2物件程式設計
- 實驗3 類和物件_基礎程式設計2物件程式設計
- 程式設計基礎程式設計
- Cultured Perl: 吸引 C 和 Java 程式設計師目光的 Perl 5.6 (轉)Java程式設計師
- 玩轉Linux – shell 程式設計基礎Linux程式設計
- [.net 物件導向程式設計基礎] (7) 基礎中的基礎——流程控制語句物件程式設計
- [.net 物件導向程式設計基礎] (6) 基礎中的基礎——運算子和表示式物件程式設計
- Python基礎入門(6)- 物件導向程式設計Python物件程式設計
- Java程式設計基礎13——常見物件_String類Java程式設計物件