useするとimportが呼ばれる話

いつぞやのHokkaido.pm Casualで聞いた気がしますが、
改めて確認してみようと思います。

こんな感じで、ファイルを配置します。

.
├── Foo.pm
└── aaa.pl

“Foo.pm”はこんな感じ。

package Foo;
use strict;
use warnings;
use v5.10;

sub import {
    my $klass = shift;
    say $klass, '::import called!';

    {
        no strict 'refs';
        *{"${klass}::foo"} = sub {
            say $klass, '::foo called!';
        };
    }
}

1;

“aaa.pl”はこんな感じ。

use strict;
use warnings;
use v5.10;

BEGIN {
    use FindBin;
    use lib $FindBin::Bin;
}
 
use Foo;

Foo::foo();
say 'bye!';

実行結果はこんな感じ。
$ perl aaa.pl
Foo::import called!
Foo::foo called!
bye!

useすると、sub import {...}が呼ばれて、
その中でFoo::fooを定義して、それをコールしています。
あれあれ、もしや、Exporterがやってることって・・・!?

“Exporter.pm”を見てみると案の定・・・。

おしまい。

Leave a Comment