別のモジュール名で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 -wuse 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 -wuse 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って。