オブジェクト編その1-bless

※この記事を書いているのは未熟なプログラマです。なのでもし間違いがあったとしても「こんな内容の記事書くんじゃない。未熟者めが!」というご意見があったらありがたく頂戴します。よろしくお願いします。

女神の祝福「bless」

もし、オブジェクト指向を学ぶつもりなら、PerlではなくJavaRuby,pythonなどを選んだほうが良いかもしれません。

Perlではなんとなく結果的にオブジェクト指向のような記述ができますが、やっている事は変数にメソッド生やすようなものです。

「無機質な変数に生命を与える」といいいますか、「本に魔法をかけたらしゃべったり、歩いたりするようになる」感じです。

上記の文章だけを読むとイタタタですが、実際にソースコードを書いてみましょう。
C:\work\example\oop_001.pl というファイルを作成してください。

#!C:\Perl\bin\perl
use strict;
use warnings;

my $book = {
    name   => '初めてのPerl',
    author => [ 'ランダル・L. シュワルツ', 'トム クリスチャンセン', ],
    price  => 3780,
};

bless $book;

$book->speak;

sub speak {
    print 'hi!';
}

それではコマンドプロンプトから実際にperlを実行してみましょう。

ね、しゃべったでしょ?

正確にいうと喋っているように見せているだけなんですが、Perlでは、変数からメソッドが呼び出せる仕組みが用意されています。それがblessです。

では、次にblessすると何が起きているかを調べましょう。
先ほどのソースコードを以下のように書き換えて下さい。

#!C:\Perl\bin\perl
use strict;
use warnings;
use Data::Dumper;

my $book = {
    name   => '初めてのPerl',
    author => [ 'ランダル・L. シュワルツ', 'トム クリスチャンセン', ],
    price  => 3780,
};

print Dumper $book;
print Dumper bless $book;

$book->speak;

sub speak {
    print 'hi!';
}

Data::Dumper モジュールによると先ほどの変数が次のように変化しています。

$VAR1 = {
          'name' => '初めてのPerl',
          'price' => 3780,
          'author' => [
                        'ランダル・L. シュワルツ',
                        'トム クリスチャンセン'
                      ]
        };

$VAR1 = bless( {
                 'name' => '初めてのPerl',
                 'price' => 3780,
                 'author' => [
                               'ランダル・L. シュワルツ',
                               'トム クリスチャンセン'
                             ]
               }, 'main' );

今度は 'main' という見慣れない文字が表示されています。実は先ほどのソースコードは簡略化していていました。先ほどのソースコードを次のように変更して下さい。

print Dumper bless ( $book, 'main' );

スクリプトを実行すると同じ結果になると思います。通常はblessする際に、この変数が、どの名前空間に属するメソッドを呼び出せるのかを指定する必要があります。

名前空間「package」

先ほどのソースコードを次のように書きかえてください。

#!C:\Perl\bin\perl
use strict;
use warnings;
use Data::Dumper;

my $book = {
    name   => '初めてのPerl',
    author => [ 'ランダル・L. シュワルツ', 'トム クリスチャンセン', ],
    price  => 3780,
};

bless ( $book, 'MyPackage' );

$book->speak;

sub speak {
    print 'hi!';
}



今度はspeakというメソッドが見つかりませんでした。
ソースコードを書き換えて次のスクリプトを実行してください。

#!C:\Perl\bin\perl
use strict;
use warnings;
use Data::Dumper;

my $book = {
    name   => '初めてのPerl',
    author => [ 'ランダル・L. シュワルツ', 'トム クリスチャンセン', ],
    price  => 3780,
};

bless ( $book, 'MyPackage' );

$book->speak;

package MyPackage;

sub speak {
    print 'hi!';
}

今度は無事メソッドが見つかりました。先ほどのmainはパッケージ名が指定されていない場合(通常はメイン処理となる)はデフォルトで指定されているものです。

この様に変数に魔法「bless」をかけて、どの名前空間のメソッドが使えるようにするかを指定して、Perlはオブジェクト志向風の書き方ができるようになっています。

お疲れさまでした。
次回はクラスの概念を説明したいと思います。