グローバル変数に一時的な値を生成する(ダイナミックスコープ)
local
は一般的に想像されるような変数の局所化をするわけではありません。
Perl4 の時代には my
が用意されておらず、
変数の局所化には local
が使われていたという経緯があります。
しかし、local
は、近年のプログラミング言語における変数の局所化とは大きく異なるため、
Perl5 以降は早くて安全な my
の利用が推奨されています。
local
は、グローバル変数に一時的な値をセットします。
my
の場合、変数名が同じだとしても、
スコープが違えば全く異なる変数として扱われます。
一方、local
は、変数を宣言しているのではなく、
ブロックの中だけで有効になる一時的な値に付け替えるだけで、変数そのものはスコープが違っても同じものです。
ブロックの中だけ別の値を付け替えるという現象が、状況によっては変数の局所化に見えてしまうため、
Perl4 の時代では変数の局所化として扱われてきました。
local
で一時的に値を付け替えることができるのはグローバル変数やパッケージ変数
(our
で宣言された変数) です。
my
で宣言された変数に対して、local
で値を一時的に付け替えることはできませんので注意してください。
次のサンプルコードはブロックの外で our
でパッケージ変数を宣言し、
ブロックの中では local
でそのパッケージ変数の値を一時的に書き換えています。
ブロックの中と外で、変数 $name の値がどのように推移していくかに注目してください。
our $name = 'Taro'; # パッケージ変数を宣言
print $name, "\n"; # Taro
{
local $name = 'Jiro'; # このブロックの中だけ値を付け替える
print $name, "\n"; # Jiro
}
print $name, "\n"; # Taro
my
と local
の違いについては、
当サイトの記事「変数の局所化 ~ my と local どう違う? ~」もぜひご覧ください。