小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

Perlでのblessについて

useやモジュールとリファレンスが理解出来てくると、blessが気になってきますね!
今回は、そんなblessの謎に迫ります。


blessを一言でいうと、リファレンスとパッケージを紐付けます。


たとえば、以下を見てください。

use strict;
use warnings;

my %test_HASH = (aaa => 'XXX', bbb =>'YYY');
my $test = bless \%test_HASH, 'package01';  # リファレンスとパッケージを紐付け

print '-->', $test->{aaa}, '<--', "\n";
$test->test01(3);
print '-->', $test->{aaa}, '<--', "\n";

package package01;
sub test01 {
    print "第1引数は$_[0], 第2引数は$_[1]です。", "\n";
    my $obj_self = shift;
    $obj_self->{aaa} = 'ZZZ';
}

『my $test = bless \%test_HASH, 'package01';』で、%test_HASHのリファレンスとpackage01のパッケージを紐付けています。
そして、blessのりターン値が%test_HASHのリファレンスなのですが、だだのリファレンスでなく、blessで紐付けられたpackage01パッケージも含まれるのです。
なので、『$test->test01(3);』のようにpackage01パッケージのtest01サブをコールすることが出来るのです。


コールする時、『->』矢印演算子を使うとtest01サブでは、自動的に第1引数が自リファレンスになるのです。
なので、『$obj_self->{aaa} = 'ZZZ';』でリファレンスからもとのハッシュ変数にアクセスして書き換えが可能なのです。


結果的にリファレンスが、ハッシュ変数(プロパティ)とサブルーチン(メソッド)を持つことになるのです。
プロパティとメソッドと言えば、そう、オブジェクトになるのですね…これが!!