frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

別のモジュール名でbless。

同僚さんが、いろいろ勉強&試行錯誤しながら

毎日遅くまで頑張って perlスクリプトを書いてくれているのですが。

「こう書いたら、どうだろう?」「あー書いたら、うまくいくかな?」と

あれこれ perl の仕様に疑問を持ちつつ作業してくれているのを見て、

私も今まで気にした事がなかった仕様が、気になる毎日。

あー、良い刺激&勉強になるなぁー。

てな訳で、先日同僚さんが書いたスクリプトを見て

ふと試してみたくなった事を、やってみた。

・Test.pm

package Test;

sub new { bless {}, $_[0]; }

sub test {

print "Test\n";

}

1;

・Dummy.pm

package Dummy;

sub new { bless {}, 'Test'; }

sub test {

print "Dummy\n";

}

1;

ここで bless の引き数に、Dummy じゃなくて

他のモジュールの名前を指定しているのが

実験のポイント。

この2つのモジュールを使って

オブジェクトを使ってみると…

・test.pl

#!/usr/bin/perl -w

use strict;

use Test;

use Dummy;

my $obj = '';

$obj = Test->new();

$obj->test();

$obj = Dummy->new();

$obj->test();

・test.pl 実行結果

Test

Test

案の定、Dummy じゃなくて

Test の test が実行されるのでした。

で、以前から bless って、面白いなぁ…と思ってたので

ついでにテスト。

今度は test.pl の中で bless しちゃうとどうなるか?っちゅーと。

・test.pl

#!/usr/bin/perl -w

use strict;

use Test;

my $obj = bless {}, 'Test';

$obj->test();

・test.pl 実行結果

Test

これまた案の定。

ちなみにこの $obj は勿論

Test=HASH(0x81aec20)
になってるんだけど。

bless には ハッシュのリファレンス以外も指定出来るので

配列のリファレンスにすると…

my $obj = bless [], 'Test';

Test=ARRAY(0x80d0c20)
…こんな感じ。

じゃあ、こーゆーのは?

my $obj = bless '', 'Test';

Can't bless non-reference value at ./bless.pl line 8.

じゃあ、リファレンスにしたら?

my $obj = bless \'', 'Test';

Modification of a read-only value attempted at ./bless.pl line 8.

じゃあ、ちゃんとスカラーのリファレンスにすると?

my $scalar      = '';

my $obj = bless \$scalar, 'Test';

Test=SCALAR(0x8624ff0)
…ですよね。

ついでに、このスカラーに値を入れるのには…

$$obj   = 'aaa';
こんな風にすれば良いし

勿論、$obj->test(); も実行すると「Test」と表示するのでした。

だから何?って言われると困るけど、

おもろいなー、perlって。