localを使うためのメモ
こないだはour
で、今回はlocal
を使うためのメモ。
2013/09/15 追記
$a
と$b
は特殊パッケージなので、
念のため、$a
を$foo
に書き換えて確認しました。(*1)
— ここまで追記 —
our
はパッケージと関連付けられた変数ということで、
次はmy
ではなくlocal
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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)とも呼ばれている。
例えば、こんな感じでファイルを配置する。
1 2 3 4 | . ├── Foo.pm ├── aaa.pl └── bbb.pl |
“Foo.pm”はこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 | package Foo; use strict; use warnings; our $foo = 1; sub hello { return $foo ; } 1; |
“aaa.pl”はこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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”の中身。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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