2011年11月8日 星期二

副常式(Subroutine)

副常式(Subroutine)

副常式。很多時候我們常為了處理類似的工作時,重複寫些相同的程式碼,

這個時候,我們就必須藉由副常式(Subroutine)來保存一個可以重複使用的區塊,

以便未來遇到同樣的問題時,可以不用再重新寫一次相似的程式碼。

在Perl中,我們使用sub表示我要宣告一個副常式,

之後再賦予這個副常式的名字,如:sub name {......}

寫好副常式後,使用的方式也很簡單,我們用and符號(&)表示我要使用副常式。

一樣我們直接看例子:

sub squre # 宣告一個副常式 叫做squre

{

$number = $number**2; # 把原本的變數平方後 取代原本的$number

print $number; # 印出最後的$number

}

$number = 4; # 設$number為4

&squre; # 執行名為squre的副常式

來解釋一下上面的程式碼。程式在跑的時候都是由上往下,

第一行的sub,把要做的事情都包起來了,

因為沒有and符號(&),所以程式不會去執行sub裡面的運算,

一直到$number = 4;這行

程式才開始設定一個變數為4,而再下一行

&squre;

程式看到and符號(&),表示要執行名為squre的副常式,

才會回過頭去執行副常式內的運算,

在這裡,因為我們已經宣告了變數,才去執行副常式內的運算,

所以不會出現變數尚未定義的問題。

因此,最後的執行結果會為 16


知道如何簡易的定義以及使用副常式以後,

接下來我們來講副常式中,參數的傳遞。

直接從例子看會比較清楚:

sub hello # 宣告一個副常式 叫做hello

{

print "hello, @_"; # 印出hello以及傳進來的參數

}

$name = "阿逸"; # 設$name為阿逸

&hello($name); # 執行名為hello的副常式 並且傳遞參數$name進去

一樣我們來解釋這段程式碼,

因為我們在執行副常式的時候,把一個參數傳進去(變數$name),

因此在副常式中會有一個預設的陣列(@_)來接這個參數,

既然預設是陣列,也就代表可以丟不只一個參數,

所以如果寫成:

sub hello # 宣告一個副常式 叫做hello

{

print "hello, @_\n"; # 印出hello以及全部傳進來的參數 換行

print "hello, $_[0] $_[1]\n"; # 當成陣列[元素]來處理也可以

}

$name1 = "阿逸"; # 設$name1為阿逸

$name2 = "阿信"; # 設$name2為阿信

&hello($name1, $name2); # 執行名為hello的副常式 並且傳遞參數$name1及$name2進去

這麼做也是可以執行的。


知道如何傳遞參數給副常式後,

大多數情況下,除了參數,我們也希望能夠從副常式中,

取得經過運算後的結果,也就是副常式的回傳值。

這時候我們會用到的保留字就是return

表示我要把某一個值帶出副常式(也就是回傳出去),

一樣我們用例子來解釋:

sub squre # 宣告一個副常式 叫做squre

{

$number_sub = $_[0]**2; # 把傳進來的參數$number取平方 取代$number_sub

return $number_sub; # 把$number_sub這個值 傳出去

}

$number = 4; # 設$number為4

$squre_number = &squre($number); # 執行副常式並且傳遞參數進去

# 再用$squre_number接副常式的回傳值

print $squre_number; # 印出$squre_number

執行結果就會是 16


以上就是簡單的副常式傳遞參數、回傳值的使用,

當程式越寫越複雜的時候,將很多類似的功能都寫成副常式,

可以大量減少重複coding類似程式碼的時間,

不過一旦你的副常式大量被重複使用時,要記得考慮參數傳遞、傳出的順序問題,

避免其他使用相同副常式的程式,因為傳遞順序更動而造成運算錯誤,

在這裡就不討論到這部分啦!

接下來,就要講Perl最大的利器之一,

Perl的正規表示式(Regular Expressions)。

沒有留言:

張貼留言