六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

Perl教學 第12篇 Perl5中的引用之5

[摘要]六、子程序的引用perl中子程序的引用與C中函數的指針類似,構造方法如下:$pointer_to_sub = sub {... declaration of sub ...};通過所構造的引用調用子程序的方法為:&$pointer_to_sub(parameters);·子程序模...
六、子程序的引用
perl中子程序的引用與C中函數的指針類似,構造方法如下:
$pointer_to_sub = sub {... declaration of sub ...};
通過所構造的引用調用子程序的方法為:
&$pointer_to_sub(parameters);


·子程序模板
子程序的返回值不僅限于數據,還可以返回子程序的引用。返回的子程序在調用處執行,但卻是在最初被創建的調用處被設置,這是由Perl對Closure處理的方式決定的。Closure意即如果你定義了一個函數,它就以最初定義的內容運行。(Closure詳見OOP的參考書)下面的例子中,設置了多個錯誤信息顯示子程序,這樣的子程序定義方法可用于創建模板。

#!/usr/bin/perl
sub errorMsg {
my $lvl = shift;
#
# define the subroutine to run when called.
#
return sub {
my $msg = shift; # Define the error type now.
print "Err Level $lvl:$msg\n"; }; # print later.
}
$severe = errorMsg("Severe");
$fatal = errorMsg("Fatal");
$annoy = errorMsg("Annoying");

&$severe("Divide by zero");
&$fatal("Did you forget to use a semi-colon?");
&$annoy("Uninitialized variable in use");
結果輸出如下:

Err Level Severe:Divide by zero
Err Level Fatal:Did you forget to use a semi-colon?
Err Level Annoying:Uninitialized variable in use
上例中,子程序errorMsg使用了局域變量$lvl,用于返回給調用者。當errorMsg被調用時,$lvl的值設置到返回的子程序內容中,雖然是用的my函數。三次調用設置了三個不同的$lvl變量值。當errorMsg返回時,$lvl的值保存到每次被聲明時所產生的子程序代碼中。最后三句對產生的子程序引用進行調用時$msg的值被替換,但$lvl的值仍是相應子程序代碼創建時的值。
很混淆是嗎?是的,所以這樣的代碼在Perl程序中很少見。
七、數組與子程序
數組利于管理相關數據,本節討論如何向子程序傳遞多個數組。前面我們講過用@_傳遞子程序的參數,但是@_是一個單維數組,不管你傳遞的參數是多少個數組,都按序存貯在@_中,故用形如my(@a,@b)=@_; 的語句來獲取參數值時,全部值都賦給了@a,而@b為空。那么怎么把一個以上的數組傳遞給子程序呢?方法是用引用。見下例:

#!/usr/bin/perl
@names = (mickey, goofy, daffy );
@phones = (5551234, 5554321, 666 );
$i = 0;
sub listem {
my ($a,$b) = @_;
foreach (@$a) {
print "a[$i] = " . @$a[$i] . " " . "\tb[$i] = " . @$b[$i] ."\n";
$i++;
}
}
&listem(\@names, \@phones);
結果輸出如下:

a[0] = mickey b[0] = 5551234
a[1] = goofy b[1] = 5554321
a[2] = daffy b[2] = 666

注意:
1、當想傳遞給子程序的參數是多于一個的數組時一定要使用引用。
2、一定不要在子程序中使用形如 (@variable)=@_; 的語句處理參數,除非你想把所有參數集中到一個長的數組中。
八、文件句柄的引用
有時,必須將同一信息輸出到不同的文件,例如,某程序可能在一個實例中輸出到屏幕,另一個輸出到打印機,再一個輸出到記錄文件,甚至同時輸出到這三個文件。相比較于每種處理寫一個單獨的語句,可以有更好的實現方式如下:
spitOut(\*STDIN);
spitOut(\*LPHANDLE);
spitOut(\*LOGHANDLE);
其中子程序spitOut的代碼如下:

sub spitOut {
my $fh = shift;
print $fh "Gee Wilbur, I like this lettuce\n";
}
注意其中文件句柄引用的語法為\*FILEHANDLE。




主站蜘蛛池模板: 日韩免费精品视频 | 亚洲福利午夜 | 青草国产| 一区二区三区在线播放视频 | 日本99视频| 欧美写真视频一区 | 青青久在线视频免费观看 | 一二三四视频中文字幕在线看 | 日韩成人在线观看视频 | 色噜噜狠狠一区二区三区 | 日本www在线视频 | 青青草色 | 日韩美一区二区三区 | 亚洲精品第一国产综合高清 | 亚洲国产成人久久综合一 | 特级中国aaa毛片 | 日本青青草 | 最新四虎4hu影库地址在线 | 生活片一级 | 亚洲欧美v视色一区二区 | 四虎在线免费观看视频 | 亚洲 自拍 中文字幕 在线 | 中文在线最新版天堂8 | 香蕉国产成版人视频在线观看 | 一级黄色免费观看 | 欧美亚洲另类图片 | 婷婷久月 | 色综合网天天综合色中文男男 | 亚洲第一伊人 | 日韩精品在线免费观看 | 日韩欧美在线观看综合网另类 | 日韩欧美国产一区二区三区 | 手机看片日韩日韩 | 日本中文不卡 | 天干夜天干天干国产 | 亚洲欧美日韩不卡一区二区三区 | 伊人影院综合 | 视频一区 在线 | 三级经典三级日本三级欧美 | 天天黄视频| 色噜噜狠狠一区二区 |