my宣言とour宣言
my宣言された変数は、レキシカル変数と呼ばれ、レキシカルスコープを持つ。
また、レキシカルスコープは、ブロック毎のスコープで、親ブロック内の子ブロックは同スコープ内になる。
したがって、実行ステップがブロック外(レキシカルスコープ外)に抜けた瞬間、そのブロックのレキシカル変数は消滅する。
また、レキシカル変数は、同じ名前で再度my宣言されると、実体は別になる。
したがって、変数のリファレンス値も別になる。
一方、our宣言された変数は、グローバル変数と呼ばれ、パッケージ内でどこからも参照変更ができ、実行中消滅することはない。
ちなみに、以下のように最上位ブロック(mainパッケージの先頭)で宣言されたレキシカル変数とグローバル変数は同じスコープを持つ(たぶん)。
use strict; my $aaa; # レキシカル変数 our $bbb; # グローバル変数 &xxx(); print "---$aaa---\n"; print "---$bbb---\n"; sub xxx { $aaa = "111"; $bbb = "222"; print "---$aaa of xxx---", "\n"; print "---$bbb of xxx---", "\n"; &yyy(); sub yyy { print "---$aaa of yyy---", "\n"; print "---$bbb of yyy---", "\n"; } }
D:\>tstour.pl ---111 of xxx--- ---222 of xxx--- ---111 of yyy--- ---222 of yyy--- ---111--- ---222---