package Bar;
use Foo;
sub bar { fooit "hello from bar"; }
package Foo;
sub fooit {
# Somehow I want this function to know it was called
# from the "Bar" module (in this case).
}
できれば、これは、呼び出し元のモジュールの名前を含む引数を明示的に渡さずに実行されます。
package Bar;
use Foo;
sub bar { fooit "hello from bar"; }
package Foo;
sub fooit {
# Somehow I want this function to know it was called
# from the "Bar" module (in this case).
}
できれば、これは、呼び出し元のモジュールの名前を含む引数を明示的に渡さずに実行されます。
組み込みcaller
関数を使用して、現在の呼び出しスタックに関する情報を取得できます。
sub fooit {
my ($pkg, $file, $line) = caller;
print STDERR "fooit was called from the $pkg package, $file:$line\n";
}
ビルトインを使用するのcaller
が最も簡単で簡単な方法ですが、Devel :: Backtraceは、エレガントなインターフェイスでより詳細な情報を提供できるCPANモジュールも見る価値があります。
package Foo;
use Devel::Backtrace;
sub fooit {
my $backtrace = Devel::Backtrace->new;
print $backtrace->point(1)->package, "\n\n";
print $backtrace;
}
package Bar;
sub bar {
Foo::fooit('hello from bar');
}
package main;
Bar::bar();
出力:
Bar
Devel::Backtrace::new called from Foo (test.pl:5)
Foo::fooit called from Bar (test.pl:14)
Bar::bar called from main (test.pl:19)