宣言の仕方は
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 行目より前で呼び出されたサブルーチンにも値が引き継がれていくのです。