[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 かな。