小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

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---