Practice of Programming

プログラム とか Linuxとかの話題

[Perl]use を最後に書いたら呼び出し元のシンボルテーブルを読める

import() は BEGIN ブロックで処理され、 BEGIN ブロックを処理してるときはまだ呼び出しもとパッケージのシンボルテーブルの情報は空っぽだった。 use しただけで呼び出しもとのパッケージのすべてのサブルーチンにフックを追加するようなモジュールは、こういうやり方だと出来ないようだ。

http://d.hatena.ne.jp/a666666/20081119/1227097354

下記のように、use Bar; を一番下に書いてやるとシンボルテーブルを読めます。

package Foo;

sub hoge {};

sub hogehoge {};

use Bar;

1;
package Bar;

use Data::Dumper;

sub import {
    my ($package) = (caller(1))[3] =~ /^(.*::)/;
    no strict 'refs';
    print Dumper \%$package;
}

1;

実行結果は、

% perl -e "use Foo;"
$VAR1 = {
          'hogehoge' => *Foo::hogehoge,
          'BEGIN' => *Foo::BEGIN,
          'hoge' => *Foo::hoge
        };

ExportToとかで使ってる。最初に見たのは、中島靖さんの、ExportAbove かな。