関数を定義する

  1. 関数(サブルーティン)


    1. 関数定義

      関数は独立したプログラムとなり、「呼び出し」により実行されます。C言語では関数(function)と呼ばれますが、他の言語では subroutine(サブルーティン)とも呼ばれます。ここでは、関数の名前を使います。Perlでは関数は
       sub <関数名> {.....}
      の形式で定義します。最後に評価した値が戻り値になります。

    2. 関数呼び出し

      関数は
       &<関数名>(<引数リスト>) {...}
      の形式で「呼び出し」実行します。引数のリストは変数@_で渡されます。

    3. 引数処理

       関数を渡すときに関数名に続く「引数」で、関数で処理するデータを渡します。このデータ(引数のリスト)は、@_ の名前の特殊配列変数で渡されます。関数の側では、@_から、値を取り出し、処理を行います。

    4. 局所変数:myとlocal

      局所変数を定義するには、名前の前に my を指定します。
       my($var1,$var2..);
      このように定義された変数は、関数内部でのみ有効です。類似した変数定義に
       local($var1,$var2..);
      があります。これは、定義した変数を局所的に利用する意味で、現在の値を待避しておき、関数が終了すると、値を元の値に回復する方法です。
       C言語の局所変数は、my による変数宣言と同じになります。

    5. 名前を "Hanako" を引数とし、紹介文
       hello my name is $name\n
      を返す関数を作成します。Perlでは引数を変数@_で受け取ります。
      $str=&hello("Hanako");
      print $str;
      
      sub hello{
      my($name) = @_; "hello my name is $name\n"; }

  2. レファレンス

    1. リファレンス

      関数の引数として渡せるデータは個々のスカラー変数のリストになります。リストそのものを関数に渡すことはできません。
       リストを関数として渡すには、リストのリファレンスを利用します。リファレンスはC言語のポインタに相当します。関数や変数の値が記憶されているメモリの番地をリファレンスとしてカラー変数に記録し、関数ではこの値を元に、リストにアクセスします。

    2. ¥と$

      変数のレファレンスを返す「演算子」は \ です。スカラ変数 $var のポインタ値は \$var となります。配列の場合は \@array です。レファレンスの値を利用して、データにアクセスするには $ を利用します。
       この機構を次の例で説明します。$iref は $i のレファレンスを記録します。このレファレンスは $i を間接的に参照します。したがって、$$iref++ は、$i の値を1増加することになります。$$iref の最初の $ は間接演算子、次の $ は(スカラー)変数を示す$です。
      #reference
      {
        $i=1;
        print "before:$i\n";
        $iref=\$i;
        $$iref++;
        print "after:$i\n";
      }

    3. 関数にリストを渡す

      配列のレファレンスを関数に渡す例を紹介します。@arrayのレファレンスを、@_を通してsub_by_ref 関数に渡します。関数側では、レファレンスを間接参照して、元の配列にアクセスします。
      #reference
      {
        #array:refrence
        @array=(1..5);
        print "before:@array\n";
        &sub_by_ref(\@array);
        print "after:@array\n";
      }
      
      
      sub sub_by_ref{
          my($refarray)=@_;
          for($i=0; $i < @$refarray; $i++){
            $$refarray[$i]++;
          }
        }

  3. 型グロブ

    1. 型グロブとは

      Perlでは、言語Cの構造体に対応するデータ型がありません。したがって、ファイルのハンドラを引き渡そうとすると、対応する型がありません。そこで、型グロブと呼ばれるデータを定義する基本型を利用し、「別名」手法で、ファイルハンドラを渡します。
       「別名」はある名前に別の名前を付ける手法です。Perlでは
       $Long_name = "Hello World" ;
        @Long_name = (1,2,3,4) ; 
      のように、同じ名前に別の型を定義することができます。これは、同じ名前(識別し)から、各型に振り分ける機構があるからで、これを、型グロブと呼びます。下図(http://www5a.biglobe.ne.jp/~n_rieko/perl/1.htmから引用)の *Longname が、型グロブ型の変数になります。

    2. 型グロブの利用

      *Long_nameを*shortに代入すると、shortの名前で、Long_nameの資産がすべて利用できるようになります。

       *short = *Long_name;
       print $short;
       print $short[1] ;

      型グロブは、プログラムする上で必須の機能ではありませんが、ファイルハンドラのような Perl の標準型ではない値を、別変数で利用するとき等に、利用できます。