localを使うためのメモ
こないだはour
で、今回はlocal
を使うためのメモ。
2013/09/15 追記
$a
と$b
は特殊パッケージなので、
念のため、$a
を$foo
に書き換えて確認しました。(*1)
— ここまで追記 —
our
はパッケージと関連付けられた変数ということで、
次はmy
ではなくlocal
。
use strict; use warnings; use v5.10; our $foo = -1; say $foo; { local $foo = 'hello'; say $foo; { local $foo = 0; say $foo; } say $foo; } say $foo;
実行するとこんな感じ。
$ perl aaa.pl
-1
hello
0
hello
-1
$a
にour
を付けなくてもいいし、
our
の代わりにlocal
を付けてもいんだけど、
my
を付けるとエラーになる。
$ perl aaa.pl
Can't localize lexical variable $foo at aaa.pl line 8.
でも、local
を使うケースは、
our
で宣言した変数に使う場合がほとんどだと思うので、
今回はour
を付けることにする。
実行結果から分かるように、
{...}
の中での変更は、{...}
の中でだけ有効になるキーワードで、
これをローカル化と呼ぶらしい。
詳しくは、ここを見るのが良いと思う。
perlsub – Perl のサブルーチン – perldoc.jp
自分の解釈だと、local
を使ったタイミングでコピーを棚の上に置いて、
local
を使った{...}
を抜けたら、棚から下ろして元に戻している。
なので、実行時のスコーピング(*2)とも呼ばれている。
例えば、こんな感じでファイルを配置する。
. ├── Foo.pm ├── aaa.pl └── bbb.pl
“Foo.pm”はこんな感じ。
package Foo; use strict; use warnings; our $foo = 1; sub hello { return $foo; } 1;
“aaa.pl”はこんな感じ。
use strict; use warnings; use v5.10; use lib '.'; use Foo; say 'Foo::hello() = ', Foo::hello(); bar(); say 'Foo::hello() = ', Foo::hello(); sub bar { $Foo::foo = 0; say 'Foo::hello() = ', Foo::hello(); }
sub bar {...}
の中でパッケージFooの$a
が書き換えられて、
以降でも影響が出てしまっている。
$ perl aaa.pl
Foo::hello() = 1
Foo::hello() = 0
Foo::hello() = 0
次は、”bbb.pl”の中身。
use strict; use warnings; use v5.10; use lib '.'; use Foo; say 'Foo::hello() = ', Foo::hello(); bar(); say 'Foo::hello() = ', Foo::hello(); sub bar { local $Foo::foo = 0; say 'Foo::hello() = ', Foo::hello(); }
これだと、sub bar {...}
の中でのみ、挙動を変えることが出来る。
$ perl bbb.pl
Foo::hello() = 1
Foo::hello() = 0
Foo::hello() = 1
でもって、正直に告白すると、Log::Minimal(metacpan)を見て勉強しました。
おしまい。
(*1) akiymさん++
(*2) Effective Perl(AMAZON)より引用。
Leave a Comment