my
で宣言した変数はパッケージじゃなくてスコープに対して所属しているから、シンボルテーブルを覗いて見つかったら逆に問題なんじゃないだろうか。で、一番外側にあるスコープはファイルそのものだから、宣言した行からあと、スコープを抜けるまで、つまりファイルの最後まで存在してる*1。our
は可視範囲に関してはmy
と同じだけど、こっちはパッケージに所属するものだから、シンボルテーブルに入ってる=名前空間を覗けば見える。…だったと思うけど、よくわからない。偉い人ならもっと詳しくわかるだろうけど。
追記
ごちゃごちゃ言うよりも、コード書いたほうが早いか。Perlishならきっとコードで分かり合えるはず。
use strict; use warnings; package main; my $foo; our $hoge; # 完全な名前は$main::hoge。 package piyo; # my $foo; # 同じスコープ内(ファイルスコープ)で同じ名前のmy変数は2回宣言できない。 # warningsを有効にしてるとperlに怒られるorz our $hoge; # これは$piyo::hogeと解釈されるから大丈夫です!>< package aaa; { my $var; } package bbb; { my $var; # これは同じ名前だけど、上の$varとは別のスコープなので問題ない。 }
こんな感じ? …書いてたらなんだか自信がなくなってきた。perldoc嫁って話だけど。
*1:より正確に言えば、ハードリファレンスを使ったりしてリファレンスカウントが残っている間は、スコープを抜けても名前が破棄されるだけで、変数そのものは破棄されない。説明が面倒になるから省略。