2006 年 4 月 14 日 23 時 59 分

シンボルテーブル


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


C# や Java には、リフレクションと呼ばれる機能がある。
プログラムからクラスのメンバの情報を得ることができ、
文字列で名前を指定してメソッドを呼ぶなどの能力をもつ。
Perl にも制限つきだが、同じような機能がある。

Perl のクラスはパッケージとして定義されるが、
パッケージにはシンボルテーブルと呼ばれる情報がある。
シンボルテーブルには、パッケージ内のサブルーチンや、
our で定義したパッケージ変数などが記録されている。

Perl シンボルテーブルは、実はただの連想配列である。
シンボルテーブルは、通常の変数と違い、
パッケージ名にコロンを 2 つつけた特別な名前を持つ。

Employee パッケージのシンボルテーブルは、
以下の構文でアクセスできる。

%Employee::

では、簡単なテストをしてみよう。
以前作った Employee クラスのシンボルをダンプしてみる。

データの出力には、Data::Dumper クラスを使う。
このクラスは、渡した変数の内容をテキストに変換する。
感覚的には toString のようなものだが、
出力されたテキストは Perl のコードになっている。
シンボルテーブルもただの変数なので、渡すことができる。

use Employee;
use Data::Dumper;
print Dumper(\%Employee::);

実行してみよう。

$VAR1 = {
          'Reflector::' => *{'Employee::Reflector::'},
          'name' => *Employee::name,
          'set_salary' => *Employee::set_salary,
          'import' => *Employee::import,
          'salary' => *Employee::salary,
          'Version' => *Employee::Version,
          'get_salary' => *Employee::get_salary,
          'BEGIN' => *Employee::BEGIN,
          'weight' => *Employee::weight,
          'new' => *Employee::new,
          'gender' => *Employee::gender
        };

どうだろう。見慣れたメソッドがキーに並んでいる。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.