local

グローバル変数に一時的な値を生成する(ダイナミックスコープ)

構文

解説

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

mylocal の違いについては、 当サイトの記事「変数の局所化 ~ my と local どう違う? ~」もぜひご覧ください。