myだとかourだとか言ってるうちに気になったので、ラクダ本を眺めつつパッケージのシンボルテーブルについて調べてみた。
パッケージ変数はパッケージ名に::をつけたハッシュ(= シンボルテーブル)に属している。そのハッシュのキーは識別子で、そのキーに対応する値は型グロブになっている。シンボルテーブルを実際に表示してみると。
use warnings; use strict; use Data::Dumper; { package WinterGarden; our $d = 'nyo'; our $u = 'yo'; our $p = 'nyu'; } print Dumper \%WinterGarden::;
実行結果:
$ perl symbol_table.pl $VAR1 = { 'p' => *WinterGarden::p, 'u' => *WinterGarden::u, 'd' => *WinterGarden::d };
というようになって、確かにハッシュになっている。なので、
$WinterGarden::{p}
とすれば識別子(ここではp)に対応した型グロブを得ることができる。型グロブにはその識別子に関連づいた値がすべて入っている(よね?)。例えば、グロブである*pには$pと@pと%pと&pなんかが入ってる。つまりは、パッケージ変数にはシンボルテーブル経由でちゃんとアクセスできるってことになる。
たしかに、パッケージ変数はシンボルテーブルに属しているな。
このへんはOK。あと型グロブの詳細部分とレキシカル変数をPerlがどう扱ってるか明日しらべてみよう。