Perl 一个函数能分辨出它是从哪个模块调用的吗?

Perl 一个函数能分辨出它是从哪个模块调用的吗?,perl,Perl,最好在不显式传递包含调用模块名称的参数的情况下完成此操作。内置函数可用于获取有关当前调用堆栈的信息 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).
}
如果标量上下文中没有参数,则将返回调用方的命名空间

 sub fooit {
     my ($pkg, $file, $line) = caller;
     print STDERR "fooit was called from the $pkg package, $file:$line\n";
 }


除非您试图复制其中一个SUB的行为,否则您很少需要它。

使用内置的
调用者
应该是最简单、最直接的方法,但也是值得一看的CPAN模块,它可以通过优雅的界面提供更多详细信息

package-Foo;
使用Devel::Backtrace;
亚福伊特{
my$backtrace=Devel::backtrace->new;
打印$backtrace->point(1)->包“\n\n”;
打印$backtrace;
}
包装条;
子栏{
Foo::fooit('hello from bar');
}
主包装;
Bar::Bar();
输出:

条
Devel::Backtrace::new从Foo调用(test.pl:5)
Foo::fooit从Bar调用(test.pl:14)
Bar::从main调用的Bar(test.pl:19)

您可能应该解释为什么您想知道,因为在所有可能的情况下,对于大多数目的来说,这几乎不是您可以依赖的。这是出于日志记录的目的,所以我可以说“fooit是在00:00:00从Bar调用的”。你能详细说明一下这里的陷阱吗?我经常编写自己的小
debug
函数,这样工作,所以我可能知道你是从哪里来的。通常,人们不想知道调用帧编译成了什么包,而是想知道它的文件名和行号,就像
warn
die
不提供换行符那样。“陷阱”(如果有的话)是任何人都可以编写
{package Other;some::function()}
,而不是像在
Other.pm
文件或类似文件中一样。事实上,他们也可以在文件和行中撒谎,但我想如果你不是在某种敌对环境中,这并不重要。即使你是,也总是有
Carp::longmesss
。为了好玩,制作一个绑定的
$CALLER
变量,它总是包含这些信息。:)
my $caller = caller();
print caller()."\n";       # '.' forces scalar context
print "".caller(), "\n";   # '.' forces scalar context