このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
シンボルテーブルは、パッケージ内部を参照するだけでなく、
それを編集することで、パッケージに動的に
サブルーチンや変数などを登録することができる。
グロブの変数各種を参照する場合は、
データ型に応じたデリファレンスをしたが、
グロブに変数各種を格納する場合は、
グロブ自身に、変数のリファレンスを代入する。
my $ver = '0.06';
*Version = \$ver;
こうすれば、$Version というスカラ変数が
パッケージに定義され、値として '0.06' が格納される。
これは、our $Version = '0.06 とほぼ同じだ。
変数だけでなく、サブルーチンを登録することもできる。
sub を使えば、コードリファレンスを作ることができるので、
それをグロブに代入すれば登録される。
my $mes = sub { print 'method' };
*method = $mes;
これで、現在のパッケージに method メソッドが登録される。
この方法を使って、Employee の salary ルーチンを
動的に登録してみると、以下のようになる。
my $salary = sub : lvalue {
my $this = $_[0];
tie(my $reflector, 'Employee::Reflector',
$this, \&get_salary, \&set_salary);
$reflector;
};
*salary = $salary;
sub は、パッケージ内にサブルーチンを宣言する以外にも、
動的にコードリファレンスを生成する役割もある。
分かりにくいが、sub の後に名前が続かない場合は後者だ。
上記の通り、lvalue ルーチンでも問題なく生成できるのだ。