副常式(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)。
沒有留言:
張貼留言