Perl日記

PerlとかRubyとかPHPとかPythonとか

stdClassをやってみた

PHPのstdClassがシンプルだったので、Perlでやってみた。

PHP

<?php
$obj = new stdClass();
$obj->first_name  = 'Taro';
$obj->family_name = 'Yamada';

print $obj->first_name;  //=> Taro
print $obj->family_name; //=> Yamada

Perl

stdClass.pm
package stdClass;
use strict;
use warnings;

sub new { bless {}, __PACKAGE__ }

sub AUTOLOAD :lvalue {
   my $self = shift;
   my $method = our $AUTOLOAD;
   $method =~ s/.*:://;
   $self->{$method};
}
sub DESTROY {}

1;
__END__
test.pl
#!/usr/bin/env perl
use strict;
use warnings;
use lib './lib';

use stdClass;

my $obj = new stdClass();
$obj->first_name  = 'Taro';
$obj->family_name = 'Yamada';

print $obj->first_name;  #=> Taro
print $obj->family_name; #=> Yamada


こうして見るとPHPPerlって書き方すごく似通ってるなぁ。


今回初めて AUTOLOAD や無名サブルーチンにも :lvalue 属性が使えることを知った。
Class::Accessor::Lvalue::Fastいいよね。