ここでは、local  について解説します。まず、言葉を覚えましょう。local を使って定義された変数は、ダイナミックスコープ変数 と呼びます。そして、local を使って変数を宣言することをダイナミックスコープ宣言と呼びます。

宣言の仕方は

local $var;           #宣言のみ
local $var = 'hello'; #宣言と同時に値も同時に格納
local($foo, $var);    #複数の変数名を同時に宣言

などです。では、次の例を見てください。

【例 1】

 1| $var = 'サブルーチンの外';
 2| print $var;                       #「サブルーチンの外」が出力される
 3| &example;
 4| sub example {
 5|     local $var = 'サブルーチンの中';
 6|     print $var;                   #「サブルーチンの中」が出力される
 7| }
 8| print $var;                       #「サブルーチンの外」が出力される

【例 2】

 1| $var = 'サブルーチンの外';
 2| print $var;                       #「サブルーチンの外」が出力される
 3| &example;
 4| sub example {
 5|     $var = 'サブルーチンの中';
 6|     print $var;                   #「サブルーチンの中」が出力される
 7| }
 8| print $var;                       #「サブルーチンの中」が出力される

お気づきでしょうが、ここまでは、使い方、結果ともに、my とまったく違いはありません。しかし、Perl 内部での扱い方は、まったく違うものになっています。local では、変数名は別々に保持されません。言い換えると、local は、グローバル変数に一時的な値を付けるといえます。Perl 内部では、それぞれの $var は、同じ変数として認識しており、コードの場所によって、値を付け替えるという作業をしています。そしてどこからその変数が呼び出されたかによって、適用する値が異なってくるのです。それがダイナミックスコープと呼ばれるゆえんです。

上記の通り、local は、グローバル変数に一時的な値を付けるということから、正確に言うとローカル変数を作成するものではないことに注意してください。本当のローカル変数を定義したい場合には、my を使うべきなのです。

最後に、サブルーチンのネストについてご紹介します。my の場合の例とコードの内容は同じなのですが、挙動が異なります。

【例 3】

 1| $var = 'サブルーチンの外';
 2| &example;
 3| sub example {
 4|     local $var = 'サブルーチンの中';
 5|     print $var;                   #「サブルーチンの中」が出力される
 6|     &example2;
 7| }
 8| sub example2 {
 9|     print $var;                   #「サブルーチンの中」が出力される
10| }
11| print $var;                       #「サブルーチンの外」が出力される

注意してみていただきたいのが、9 行目です。my の場合には、$var は 1 行目で宣言された値「サブルーチンの外」が出力されます。ところがこの例の場合では、4 行目で宣言された $var の値が引き継がれて表示されます。4 行目で宣言されたダイナミックスコープ変数 $var は、サブルーチンが終了するまでの 7 行目まで有効になります。local で宣言された場合、7 行目より前で呼び出されたサブルーチンにも値が引き継がれていくのです。


<< 戻る

コーナー Top へ >>

戻る

会社案内 | 特定商取引法に基づく表示 | プライバシーポリシー | 当サイトへのリンクについて | お問い合わせ