第6章在講function。
function 的構架
sub func; # 這是declaration
sub func # 這是definition
{
print " hi \n";
}
要使用function 的話,就打
func();
PERL並沒有限定要幾個參數
舉個例子
sub add
{
return $@_[0] + $@_[1];
}
$x = 1; $y = 2;
$z = add($x,$y);
由此發現傳入的參數會被放在array @_ 裡,$@_[0] 也可以用$ARG[0] (但要在program 一開始打use English; )。
傳入的方式是call by reference ,如果想要call by value 的話,
一般的做法是在function 裡在另開一個變數放@_或@ARG的值。
這時要注意scope 的問題。
例如:
$temp = 2;
sub hi
{
$temp = 1;
print $temp;
}
在hi 裡的$temp 和外面的$temp 其實是同一個的,所以$temp = 1 在離開function後。
$temp 就真的變成1 了。如果想要有scope 的區別的話,就在變數前面打
my $temp ; #離開區塊後$temp 就bye 了。
所以如果上面同樣的function ,要區別兩個$temp ; 那就在前面都打上my 就好了。
沒有打my 的變數會被視為global variable。
已經談完了function 變數的scope 和如何操作function 裡的變數,以及call by reference , value後,
我們也可以傳reference 進去當變數。
像是
$sum =1;
add(\$sum);
sub add
{
my $t = $ARG[0];
$$t++;
}
$sum 就變成2 了。
我們也可以類似function pointer 的東西。例如
$ref_add = \&add; # &是強調add 是個function
用$ref_add 呼叫的方法為&$ref_add();
最後這一章有談到customized sort function
sort { $a <=> $b} @list;
$a, $b 是有特殊意義的,我猜是比較@list 中兩個代表的變數。
<=> 回傳1 當$a > $b 0, $a==$b, -1 $a < $b;
cmp 是用於string , <=> 用於number
當然我們也可以自己定差compare function
sort mycmp @list;
sub mycmp
{
if(...)
{
return 1;
}
elsif(...)
{
return 0;
}
else
{
return -1;
}
}
還有pack 以及unpack function 的使用方法。
我只知道說是用於轉換string 和array
當$str="abc";
@arr = unpack("C3",$str);
$arr[0] 是a 的ASCII 的編碼數字。
... 以此類推。
也可以反著做。
$str = pack ("C3",@arr);
這邊C3是指說有3 個字。
OK,這一章說完了。
留言列表