Perlでは、変数はレキシカルまたは動的スコープを持つことができます。
myはレキシカルスコープの変数を作成します:その変数は定義されたブロック内でのみ可視です。localは動的スコープのグローバル(パッケージ)変数の値を一時的に上書きします:新しい値はブロックを抜けるまで呼び出されたすべての関数で見えます。ourはグローバル(パッケージ)変数を定義しますが、現在のレキシカルブロック内でのみ可視です。例:
our $x = 10; sub test_my { my $x = 20; inner(); } sub test_loc { local $x = 30; inner(); } sub inner { print $x; } test_my(); # 10を出力 — my $xはinnerから見えません $| = 1; test_loc(); # 30を出力 — local $xはinnerから見えます
localは、特殊なグローバル変数$_、$/、$@などのパッケージ変数の値を変更するために使用されます。
次のコードの実行結果は何ですか、そしてその理由は?
our $a = 5; sub outer { my $a = 10; inner(); } sub inner { print $a; } outer();
回答:5を出力します。なぜなら、outerのmy変数$aはinnerから見えず、ourで宣言されたパッケージ変数$aが使用されるからです。
事例
事例
事例
JavaScript開発からPerlに移行した開発者は、経験から必要もなくあちこちでourを使って変数を宣言しようとしたため、予期しないグローバル変数が発生し、カプセル化や名前の衝突を妨げる結果となりました。