てきとうなメモ

本の感想とか技術メモとか

Perlで構造体

Perlで構造体を作りたい場合,Class::Structというモジュールがある.まあハッシュでもいいけども,$a->hogeみたいに構造体っぽくアクセスしたい.Class::Accessorでもいいのだが,Class::Accessorはハッシュをblessしているのに対して,Class::Structは配列をblessして作成することができるので,少し効率が良さそう.

使い方は以下のような感じ.

package Myobj;
use Class::Struct;

struct(s => '$', a => '@', h => '%', c => 'My_Other_Class');

package My_Other_Class;
use Class::Struct;
struct(s => '$');
sub hello {
  my ($self) = @_;
  print "hello, " . $self->s(), "\n";
}

package main;

my $obj = new Myobj;
$obj->s("foo");
print "s: " . $obj->s, "\n";
$obj->a(0, "bar");
print "a: ", $obj->a(0), "\n";
$obj->h("spam", "egg");
print "h: ", $obj->h("spam"), "\n";

my $other_obj = new My_Other_Class;
$other_obj->s("Class::Struct");
$obj->c($other_obj);
$obj->c->hello();

これを実行すると

$ perl synopsis.pl
s: foo
a: bar
h: egg
hello, Class::Struct
$ 

構造体のメンバにはスカラー,配列,ハッシュ,オブジェクトを指定できる.モジュールの中ではそれらを解析しては動的にコードを生成してevalしている.