Perlの変数宣言
our, my, local
our. パッケージ変数
スコープの外からでもパッケージ名をつけて参照できるmy. レキシカルスコープ
スコープ内で参照可能な変数を宣言local. ダイナミックスコープ
グローバルな変数がいた場合一時スタックに退避
実行時のスコープ内で宣言した値を持つ
スコープ
- {} で囲われた範囲
localやmyはスコープを外れた場所から参照できない
レキシカルスコープとダイナミックスコープ
- レキシカルスコープ
静的なスコープ
コードに書かれた {} 内でのスコープ
our $hoge;
sub B{
return $hoge;
}
sub A{
my $hoge;
return B;
}
Aのみで参照可能
- ダイナミックスコープ
動的スコープ
実行時のスコープで参照可能
our $hoge;
sub B{
return $hoge;
}
sub A{
local $hoge;
return B;
}
実行時A内でBが呼ばれるので、AB内で参照可能
ちょっと分かり難かったので検証
#!/usr/local/bin/perl
package test;
use strict;
use warnings;
our $hoge = "hello";
sub localtest
{
local $hoge = "good";
print "localtest\n";
print "$hoge\n";
print "$test::hoge\n";
}
sub mytest
{
my $hoge = "good";
print "mytest\n";
print "$hoge\n";
print "$test::hoge\n";
}
mytest;
localtest;
実行結果
localtest
good
good
mytest
good
local
localはパッケージ変数に(元値はスタックに退避して)上書き
myは別に同名の変数を持つみたい
参照
http://d.hatena.ne.jp/TAKESAKO/20080110/1199969773 http://d.hatena.ne.jp/perlcodesample/20110128/1300165343