亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? perl13.htm

?? PERL5中文教程
?? HTM
?? 第 1 頁 / 共 2 頁
字號:
Cocoa::closeMain($cup);
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;其運行結果如下:
<blockquote>
 /*<br>
 ** Created by Cocoa.pm<br>
 ** Use at own risk <br>
 */<br>
 import java.io.InputStream;<br>
 import java.net.*;<br>
<br>
 public class Msg extends java.applet.Applet implements Runnable {<br>
 }
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;注意:如果用->操作符調用方法(也叫間接調用),參數必須用括號括起來,如:$cup->setImports( 'java.io.InputStream', 'java.net.*');而雙冒號調用如:Cocoa::setImports($cup,  'java.io.InputStream', 'java.net.*');也可去掉括號寫成:Cocoa::setImports $cup,  'java.io.InputStream', 'java.net.*' ;<br>
<a name="8">八、重載</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;有時需要指定使用哪個類的方法,如兩個不同的類有同名方法的時候。假設類Espresso和Qava都定義了方法grind,可以用::操作符指定使用Qava的方法:<br>
&nbsp;&nbsp;&nbsp;&nbsp;$mess = Qava::grind("whole","lotta","bags");<br>
&nbsp;&nbsp;&nbsp;&nbsp;Qava::grind($mess, "whole","lotta","bags");<br>
&nbsp;&nbsp;&nbsp;&nbsp;可以根據程序的運行情況來選擇使用哪個類的方法,這可以通過使用符號引用去調用來實現:<br>
&nbsp;&nbsp;&nbsp;&nbsp;$method = $local ? "Qava::" : "Espresso::";<br>
&nbsp;&nbsp;&nbsp;&nbsp;$cup->{$method}grind(@args);<br>
<a name="9">九、析構函數</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;Perl跟蹤對象的鏈接數目,當某對象的最后一個應用釋放到內存池時,該對象就自動銷毀。對象的析構發生在代碼停止后,腳本將要結束時。對于全局變量而言,析構發生在最后一行代碼運行之后。<br>
&nbsp;&nbsp;&nbsp;&nbsp;如果你想在對象被釋放之前獲取控制權,可以定義DESTROY()方法。DESTROY()在對象將釋放前被調用,使你可以做一些清理工作。DESTROY()函數不自動調用其它DESTROY()函數,Perl不做內置的析構工作。如果構造函數從基類多次bless,DESTROY()可能需要調用其它類的DESTROY()函數。當一個對象被釋放時,其內含的所有對象引用自動釋放、銷毀。<br>
&nbsp;&nbsp;&nbsp;&nbsp;一般來說,不需要定義DESTROY()函數,如果需要,其形式如下:<br>
<blockquote>
sub DESTROY {<br>
#<br>
# Add code here.<br>
#<br>
}
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;因為多種目的,Perl使用了簡單的、基于引用的垃圾回收系統。任何對象的引用數目必須大于零,否則該對象的內存就被釋放。當程序退出時,Perl的一個徹底的查找并銷毀函數進行垃圾回收,進程中的一切被簡單地刪除。在UNIX類的系統中,這像是多余的,但在內嵌式系統或多線程環境中這確實很必要。<br>
<a name="10">十、繼承</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;類方法通過@ISA數組繼承,變量的繼承必須明確設定。下例創建兩個類Bean.pm和Coffee.pm,其中Coffee.pm繼承Bean.pm的一些功能。此例演示如何從基類(或稱超類)繼承實例變量,其方法為調用基類的構造函數并把自己的實例變量加到新對象中。<br>
&nbsp;&nbsp;&nbsp;&nbsp;Bean.pm代碼如下:<br>
<blockquote>
package Bean;<br>
require Exporter;<br>
@ISA = qw(Exporter);<br>
@EXPORT = qw(setBeanType);<br>
<br>
sub new {<br>
 &nbsp;   my $type = shift;<br>
 &nbsp;   my $this = {};<br>
 &nbsp;   $this->{'Bean'} = 'Colombian';<br>
 &nbsp;   bless $this, $type;<br>
 &nbsp;   return $this;<br>
}<br>
<br>    
#<br>
# This subroutine sets the class name<br>
sub setBeanType{<br>
 &nbsp;   my ($class, $name) =  @_;<br>
 &nbsp;   $class->{'Bean'} = $name;<br>
 &nbsp;   print "Set bean to $name \n";<br>    
}<br>
1;
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;此類中,用$this變量設置一個匿名哈希表,將'Bean'類型設為'Colombian'。方法setBeanType()用于改變'Bean'類型,它使用$class引用獲得對對象哈希表的訪問。<br>
&nbsp;&nbsp;&nbsp;&nbsp;Coffee.pm代碼如下:<br>
<blockquote>
1&nbsp;  #<br>
2&nbsp;  # The Coffee.pm file to illustrate inheritance.<br>
3&nbsp;  #<br>
4&nbsp;  package Coffee;<br>
5&nbsp;  require Exporter;<br>
6&nbsp;  require Bean;<br>
7&nbsp;  @ISA = qw(Exporter, Bean);<br>
8&nbsp;  @EXPORT = qw(setImports, declareMain, closeMain);<br>
9&nbsp;  #<br>
10 # set item<br>
11 #<br>
12 sub setCoffeeType{<br>
13 &nbsp;    my ($class,$name) =  @_;<br>
14 &nbsp;    $class->{'Coffee'} = $name;<br>
15 &nbsp;    print "Set coffee type to $name \n";<br>
16 &nbsp;    }<br>
17  #<br>
18  #  constructor<br>
19  #<br>
20  sub new {<br>
21 &nbsp;     my $type  = shift;<br>
22 &nbsp;      my $this  = Bean->new();     ##### <- LOOK HERE!!! ####<br>
23 &nbsp;     $this->{'Coffee'} = 'Instant';  # unless told otherwise<br>
24 &nbsp;     bless $this, $type;<br>
25 &nbsp;     return $this;<br>
26 &nbsp;     }<br>
27  1;
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;第6行的require Bean;語句包含了Bean.pm文件和所有相關函數,方法setCoffeeType()用于設置局域變量$class->{'Coffee'}的值。在構造函數new()中,$this指向Bean.pm返回的匿名哈希表的指針,而不是在本地創建一個,下面兩個語句分別為創建不同的哈希表從而與Bean.pm構造函數創建的哈希表無關的情況和繼承的情況:<br>
&nbsp;&nbsp;&nbsp;&nbsp;my $this = {}; #非繼承<br>
&nbsp;&nbsp;&nbsp;&nbsp;my $this = $theSuperClass->new(); #繼承<br>
&nbsp;&nbsp;&nbsp;&nbsp;下面代碼演示如何調用繼承的方法:<br>
<blockquote>
1&nbsp;   #!/usr/bin/perl<br>
2&nbsp;   push (@INC,'pwd');<br>
3&nbsp;   use Coffee;<br>
4&nbsp;   $cup = new Coffee;<br>
5&nbsp;   print "\n -------------------- Initial values ------------ \n";<br>
6&nbsp;   print "Coffee: $cup->{'Coffee'} \n";<br>
7&nbsp;   print "Bean: $cup->{'Bean'} \n";<br>
8&nbsp;   print "\n -------------------- Change Bean Type ---------- \n";<br>
9&nbsp;   $cup->setBeanType('Mixed');<br>
10  print "Bean Type is now $cup->{'Bean'} \n";<br>
11  print "\n ------------------ Change Coffee Type ---------- \n";<br>
12  $cup->setCoffeeType('Instant');<br>
13  print "Type of coffee: $cup->{'Coffee'} \n";
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;該代碼的結果輸出如下:<br>
<blockquote>
 -------------------- Initial values ------------<br>
 Coffee: Instant<br>
 Bean: Colombian<br>
 -------------------- Change Bean Type ----------<br>
 Set bean to Mixed<br>
 Bean Type is now Mixed <br>
 ------------------ Change Coffee Type ----------<br>
 Set coffee type to Instant<br>
 Type of coffee: Instant
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;上述代碼中,先輸出對象創建時哈希表中索引為'Bean'和'Coffee'的值,然后調用各成員函數改變值后再輸出。<br>
&nbsp;&nbsp;&nbsp;&nbsp;方法可以有多個參數,現在向Coffee.pm模塊增加函數makeCup(),代碼如下:<br>
<blockquote>
sub makeCup {<br>
 &nbsp;   my ($class, $cream, $sugar, $dope) = @_;<br>
 &nbsp;   print "\n================================== \n";    <br>
 &nbsp;   print "Making a cup \n";<br>
 &nbsp;   print "Add cream \n" if ($cream);<br>
 &nbsp;   print "Add $sugar sugar cubes\n" if ($sugar);<br>
 &nbsp;   print "Making some really addictive coffee ;-) \n" if ($dope);<br>
 &nbsp;   print "================================== \n";<br>
}
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;此函數可有三個參數,不同數目、值的參數產生不同的結果,例如:<br>
<blockquote>
1&nbsp;   #!/usr/bin/perl<br>
2&nbsp;   push (@INC,'pwd');<br>
3&nbsp;   use Coffee;<br>
4&nbsp;   $cup = new Coffee;<br>
5&nbsp;   #<br>
6&nbsp;   #  With no parameters<br>
7&nbsp;   #<br>
8&nbsp;   print "\n Calling  with no parameters: \n";<br>
9&nbsp;   $cup->makeCup;<br>
10  #<br>
11  #  With one parameter<br>
12  #<br>
13  print "\n Calling  with one parameter: \n";<br>
14  $cup->makeCup('1');<br>
15  #<br>
16  #  With two parameters<br>
17  #<br>
18  print "\n Calling  with two parameters: \n";<br>
19  $cup->makeCup(1,'2');<br>
20  #<br>
21  #  With all three parameters<br>
22  #<br>
23  print "\n Calling  with three parameters: \n";<br>
24  $cup->makeCup('1',3,'1');
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;其結果輸出如下:<br>
<blockquote>
 Calling  with no parameters:<br>
==================================<br>
Making a cup<br>
==================================<br>
 Calling  with one parameter:<br>
==================================<br>
Making a cup<br>
Add cream<br>
==================================<br>
 Calling  with two parameters:<br>
==================================<br>
Making a cup<br>
Add cream<br>
Add 2 sugar cubes<br>
==================================<br>
 Calling  with three parameters:<br>
==================================<br>
Making a cup<br>
Add cream<br>
Add 3 sugar cubes<br>
Making some really addictive coffee ;-)<br>
==================================
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;在此例中,函數makeCup()的參數既可為字符串也可為整數,處理結果相同,你也可以把這兩種類型的數據處理區分開。在對參數的處理中,可以設置缺省的值,也可以根據實際輸入參數值的個數給予不同處理。<br>
<a name="11">十一、子類方法的重載</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;繼承的好處在于可以獲得基類輸出的方法的功能,而有時需要對基類的方法重載以獲得更具體或不同的功能。下面在Bean.pm類中加入方法printType(),代碼如下:<br>
<blockquote>
sub printType {<br>
 &nbsp;   my $class =  shift @_;<br>
 &nbsp;   print "The type of Bean is $class->{'Bean'} \n";<br>
}
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;然后更新其@EXPORT數組來輸出:<br>
&nbsp;&nbsp;&nbsp;&nbsp;@EXPORT = qw ( setBeanType , printType );<br>
&nbsp;&nbsp;&nbsp;&nbsp;現在來調用函數printType(),有三種調用方法:<br>
<blockquote>
$cup->Coffee::printType();<br>
$cup->printType();<br>
$cup->Bean::printType();
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;輸出分別如下:<br>
<blockquote>
The type of Bean is Mixed<br>
The type of Bean is Mixed<br>
The type of Bean is Mixed
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;為什么都一樣呢?因為在子類中沒有定義函數printType(),所以實際均調用了基類中的方法。如果想使子類有其自己的printType()函數,必須在Coffee.pm類中加以定義:<br>
<blockquote>
#<br>
# This routine prints the type of $class->{'Coffee'}<br>
#<br>
sub printType {<br>
 &nbsp;   my $class =  shift @_;<br>
 &nbsp;   print "The type of Coffee is $class->{'Coffee'} \n";<br>
}
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;然后更新其@EXPORT數組:<br>
&nbsp;&nbsp;&nbsp;&nbsp;@EXPORT = qw(setImports, declareMain, closeMain, printType);<br>
&nbsp;&nbsp;&nbsp;&nbsp;現在輸出結果變成了:<br>
<blockquote>
The type of Coffee is Instant<br>
The type of Coffee is Instant<br>
The type of Bean is Mixed
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;現在只有當給定了Bean::時才調用基類的方法,否則直接調用子類的方法。<br>
&nbsp;&nbsp;&nbsp;&nbsp;那么如果不知道基類名該如何調用基類方法呢?方法是使用偽類保留字SUPER::。在類方法內使用語法如:$this->SUPER::function(...argument list...); ,它將從@ISA列表中尋找。剛才的語句用SUPER::替換Bean::可以寫為$cup->SUPER::printType(); ,其結果輸出相同,為:<br>
<blockquote>The type of Bean is Mixed</blockquote>
 十二、Perl類和對象的一些注釋<br>
&nbsp;&nbsp;&nbsp;&nbsp;OOP的最大好處就是代碼重用。OOP用數據封裝來隱藏一些復雜的代碼,Perl的包和模塊通過my函數提供數據封裝功能,但是Perl并不保證子類一定不會直接訪問基類的變量,這確實減少了數據封裝的好處,雖然這種動作是可以做到的,但卻是個很壞的編程風格。<br>
注意:<blockquote>1、一定要通過方法來訪問類變量。<br>2、一定不要從模塊外部直接訪問類變量。</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;當編寫包時,應該保證方法所需的條件已具備或通過參數傳遞給它。在包內部,應保證對全局變量的訪問只用通過方法傳遞的引用來訪問。對于方法要使用的靜態或全局數據,應該在基類中用local()來定義,子類通過調用基類來獲取。有時,子類可能需要改變這種數據,這時,基類可能就不知道怎樣去尋找新的數據,因此,這時最好定義對該數據的引用,子類和基類都通過引用來改變該數據。<br>
&nbsp;&nbsp;&nbsp;&nbsp;最后,你將看到如下方式來使用對象和類:<br>
&nbsp;&nbsp;&nbsp;&nbsp;use coffee::Bean;<br>
&nbsp;&nbsp;&nbsp;&nbsp;這句語句的含義是“在@INC數組所有目錄的Coffee子目錄來尋找Bean.pm”。如果把Bean.pm移到./Coffee目錄,上面的例子將用這一use語句來工作。這樣的好處是有條理地組織類的代碼。再如,下面的語句:<br>
&nbsp;&nbsp;&nbsp;&nbsp;use Another::Sub::Menu;<br>
&nbsp;&nbsp;&nbsp;&nbsp;意味著如下子目錄樹:<br>
&nbsp;&nbsp;&nbsp;&nbsp;./Another/Sub/Menu.pm<br>


<p align="center"><a href="perl12.htm">上一章</a> <a href="perl14.htm">下一章</a> <a href="index.htm">目錄</a></p>
<br>
</body>
</html>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人av网站在线观看| 久久国产生活片100| 成人激情视频网站| 欧美激情在线看| 成人黄色在线网站| 有码一区二区三区| 欧美日韩欧美一区二区| 免费高清在线视频一区·| 精品福利在线导航| 成人永久aaa| 亚洲一区二区三区四区五区黄| 欧美影院午夜播放| 天使萌一区二区三区免费观看| 日韩精品一区二区三区在线| 国产成人免费在线视频| 亚洲精品日韩一| 69精品人人人人| 成人综合婷婷国产精品久久 | 国产精品黄色在线观看 | 色综合久久久网| 午夜成人在线视频| 欧美大度的电影原声| 风间由美一区二区av101| 亚洲视频资源在线| 日韩欧美一区在线| 99久久婷婷国产精品综合| 午夜久久久久久| 国产免费观看久久| 欧美色区777第一页| 91麻豆精品在线观看| 亚洲一区免费观看| 精品国产乱码久久久久久免费| 波多野结衣欧美| 另类的小说在线视频另类成人小视频在线| 国产清纯白嫩初高生在线观看91 | 中文字幕一区二区视频| 91精品国产综合久久久久久久久久 | 亚欧色一区w666天堂| 久久久影视传媒| 欧美三级日韩三级| 丁香亚洲综合激情啪啪综合| 午夜激情一区二区| 亚洲视频你懂的| 久久先锋影音av| 欧美一区二区三区免费观看视频| 91婷婷韩国欧美一区二区| 国内久久精品视频| 午夜亚洲国产au精品一区二区| 欧美国产激情一区二区三区蜜月 | 91日韩精品一区| 韩国一区二区三区| 亚洲成人综合在线| 亚洲欧美国产三级| 国产视频一区在线播放| 欧美电视剧免费全集观看| 精品视频999| 91免费版pro下载短视频| 国产一区二区三区| 久久99在线观看| 免费成人av在线| 亚洲bt欧美bt精品| 亚洲一二三级电影| 亚洲日本在线天堂| 综合亚洲深深色噜噜狠狠网站| 久久婷婷国产综合精品青草| 欧美高清你懂得| 欧美日韩国产一级片| 欧美在线你懂得| 欧美在线不卡视频| 色婷婷狠狠综合| 色综合中文字幕国产 | 1024成人网色www| 国产精品美女视频| 国产精品色噜噜| 欧美经典一区二区| 国产精品视频线看| 中文字幕+乱码+中文字幕一区| 久久久精品一品道一区| 久久久精品免费免费| 国产偷国产偷精品高清尤物| 国产欧美日韩视频一区二区| 久久久久久久久久久久久夜| 国产欧美日韩综合| 综合中文字幕亚洲| 亚洲成人中文在线| 成人亚洲一区二区一| 成人h动漫精品一区二区| 丰满放荡岳乱妇91ww| 成人视屏免费看| 99re这里都是精品| 日本道精品一区二区三区| 欧美日韩三级在线| 欧美成人精精品一区二区频| 26uuu亚洲| 亚洲欧洲另类国产综合| 亚洲精品国产品国语在线app| 亚洲国产乱码最新视频| 婷婷久久综合九色综合绿巨人| 免费在线观看视频一区| 国产风韵犹存在线视精品| 91在线观看成人| 在线不卡中文字幕播放| 精品国产免费一区二区三区四区 | 捆绑调教美女网站视频一区| 国产一区二区不卡| 99re这里都是精品| 欧美另类久久久品| 国产三级精品三级在线专区| 亚洲精品中文在线观看| 日韩av成人高清| 盗摄精品av一区二区三区| 欧美日韩久久不卡| 国产亚洲欧美激情| 一区二区成人在线视频| 久久成人免费日本黄色| 不卡的av中国片| 欧美一区二区在线免费播放 | 91精品国产综合久久香蕉麻豆| 精品999在线播放| 亚洲在线视频一区| 国产九色sp调教91| 欧美日本在线视频| 国产精品美日韩| 久久99精品国产91久久来源 | 精品视频一区二区三区免费| 久久人人爽爽爽人久久久| 一区二区三区精品在线观看| 国产精品一区二区久久精品爱涩| 色偷偷久久一区二区三区| 精品国精品自拍自在线| 夜夜嗨av一区二区三区中文字幕 | 92国产精品观看| 欧美成人女星排名| 午夜日韩在线电影| 91在线免费看| 国产性做久久久久久| 日本中文字幕不卡| 91官网在线免费观看| 久久久久久久综合| 久久99精品久久久久久久久久久久 | 色婷婷狠狠综合| 亚洲国产高清在线观看视频| 精品一区免费av| 日韩一级二级三级| 亚洲成a人v欧美综合天堂| 一本色道综合亚洲| 国产精品国产三级国产普通话99| 欧日韩精品视频| 亚洲一区二区三区视频在线| 奇米亚洲午夜久久精品| 欧美一区二区在线观看| 日本vs亚洲vs韩国一区三区二区| 欧美久久久久久蜜桃| 久久se这里有精品| 中文在线免费一区三区高中清不卡 | 不卡在线观看av| 久久精品视频免费| 不卡欧美aaaaa| 亚洲激情av在线| 91福利资源站| 青娱乐精品视频在线| 日韩精品一区在线| 国产精品中文字幕日韩精品| 26uuu亚洲婷婷狠狠天堂| 国产精品系列在线播放| 中文字幕av一区二区三区免费看| 成年人网站91| 国产不卡视频在线播放| 国产福利一区在线| 日本sm残虐另类| 国产精品一区二区在线播放| 久草在线在线精品观看| 男女性色大片免费观看一区二区| 日韩一区二区在线观看| 日韩va亚洲va欧美va久久| 欧美精品三级在线观看| 国产永久精品大片wwwapp| 国产欧美精品一区| 久久久久九九视频| 日本不卡一二三| 欧美三级中文字幕| 日韩女优av电影| 亚洲码国产岛国毛片在线| 99精品在线免费| 亚洲综合视频网| 91麻豆精品国产91久久久使用方法 | 欧美日韩五月天| 天堂蜜桃一区二区三区| 欧美一区二区三区爱爱| 精品一区二区三区在线播放 | 精品少妇一区二区三区免费观看 | 亚洲一区二区偷拍精品| 在线不卡一区二区| 国产美女在线观看一区| 国产视频一区二区在线| 99国产精品久久久| 日韩中文字幕av电影| 精品国产乱码久久久久久蜜臀| 成人午夜av电影| 亚洲电影第三页|