シンボルテーブルから型グロブを得る

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がどう扱ってるか明日しらべてみよう。