Perl-users.jp

LL温泉2008用の資料です。 最近の Perl OOP のこと。

Perl5 の OOP と簡単なモジュールのつくりかた。

Perl5 についての見解

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;

Moose

package Person;  # くらすせんげん
use Moose; # Moose なクラスであることを宣言

has name => (is => 'rw'); # アクセサを宣言する
has age  => (is => 'rw'); # rw => read/write 可能なアクセサの意

1; # なんでもいい。

Moose をさらに

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 $