実は空文字かundefでblessすると勝手にmainにしてくれるんだ

日々ちょっとした発見ってあるもので、お題目通り空文字かundefでblessするとそのオブジェクトはmainパッケージとして扱われるようです。

コード

use strict;
use warnings;
use Data::Dumper;

my $self = bless({foo => 'bar'}, undef);
print Dumper $self;

結果

Use of uninitialized value in bless at undef_bless.pl line 5.
Explicit blessing to '' (assuming package main) at undef_bless.pl line 5.
$VAR1 = bless( {
                 'foo' => 'bar'
               }, 'main' );

怒られメッセージにも出てますけど確かにmainとして装われてますね。

もちろん↓でも同じ結果。

my $self = bless {foo => 'bar'}, '';

という事はmainのサブルーチン呼び出せるんじゃね?
main::fooとかオブジェクトメソッドとして呼び出せる筈だよねん。
という事でやってみたら出来た!

use strict;
use warnings;
use Data::Dumper;

sub say {
    my $self = shift;
    my $str = shift;
    print "$str\n";
}

my $self = bless({}, undef);
$self->say('hello!');
hello!

まぁ警告出てるんで率先してやってはいかんですね・・。