LL温泉2008用の資料です。 最近の Perl OOP のこと。
Perl5 の OOP と簡単なモジュールのつくりかた。
Perl5 の OOP はむずかしい。
package Person; # クラス宣言
use strict;
use warnings;
sub new {
my ($class) = @_;
return bless {
name => '',
age => undef,
}, $class;
}
sub name {
my ($self, $name) = @_;
$self->{'name'} = $name if $name;
return $self->{'name'};
}
sub age {
my ($self, $age) = @_;
$self->{'age'} = $age if $age; # 引数つきだったらセッターになります
return $self->{'age'};
}
1;
package Person; # くらすせんげん
use Moose; # Moose なクラスであることを宣言
has name => (is => 'rw'); # アクセサを宣言する
has age => (is => 'rw'); # rw => read/write 可能なアクセサの意
1; # なんでもいい。
has name => (
is => 'rw', # 読み書き両用のアクセサ
isa => 'Str', # 文字列型
default => 'Bob' # デフォルト値を提供
);
has staff => (
is => 'ro', # 読みこみ専用アクセサ
isa => 'ArrayRef', # 配列リファレンス型
lazy => 1, # default の評価を遅延させる
default => sub { [qw(Bob Alice Tim)] }, # デフォルト値をかえす無名関数
);
# CPAN モジュールを各種いれる
% sudo -H cpan
cpan[1]> install Moose
cpan[1]> install Module::Install
# pmsetup という perl module をつくるためのスクリプトをダウンロードする
% wget http://svn.bulknews.net/repos/public/misc/pmsetup
# pmsetup をうごかす
% perl pmsetup Point
# なにかきかれたら、てきとうにこたえる。
# なかみをみてみる
% tree Point
.
|-- Changes
|-- MANIFEST.SKIP
|-- Makefile.PL
|-- README
|-- lib
| `-- Point.pm
|-- t
| `-- 00_compile.t
`-- xt
|-- perlcritic.t
|-- pod.t
`-- podspell.t
3 directories, 9 files
# できたディレクトリにうつる
% cd Point
# Makefile ができる
% perl Makefile.PL
# テストをうごかす(テストかいてないのでとおるはず)
% make test
t/01_simple.t というファイルを作成し、内容を下記のようにする
use strict;
use warnings;
use Test::More tests => 4; # テストの個数を真面目に指定してあげてください
use_ok 'Point'; # Point.pm を import/require してだいじょうぶなことを確認
my $point = Point->new(x => 5, y => 7); # インスタンスをつくってみる
is $point->x, 5; # 引数であたえたものがはいってることを確認する
is $point->y, 7;
$point->x(9); # セッターをつかってみる
is $point->x, 9; # セットされてることを確認する
この状態で
% make test
すると、テストがこけるので、lib/Point.pm の中を上記のコードを参考にして変更する。
test がとおれば成功です。
Last modified: $Date: 2008-10-26T05:38:56.231052Z $