close

第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,這一章說完了。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 lettice0913 的頭像
    lettice0913

    斑的家

    lettice0913 發表在 痞客邦 留言(0) 人氣()