我有一个调用该函数的代码。但我不知道这个函数属于哪个模块。我需要它来修改这个功能。
我怎样才能检查它?
最佳答案
Perl 的调试器可以按照您想要的方式进行挖掘。例如:
main::(-e:1): 0 DB<1> sub foo {} DB<2> x \&foo 0 CODE(0xca6898) -> &main::foo in (eval 5)[/usr/share/perl/5.10/perl5db.pl:638]:2-2
It does this using Devel::Peek:
=head2 C<CvGV_name_or_bust> I<coderef>
Calls L<Devel::Peek> to try to find the glob the ref lives in; returns
C<undef> if L<Devel::Peek> can't be loaded, or if C<Devel::Peek::CvGV> can't
find a glob for this ref.
Returns C<< I<package>::I<glob name> >> if the code ref is found in a glob.
=cut
sub CvGV_name_or_bust {
my $in = shift;
return unless ref $in;
$in = \&$in; # Hard reference...
eval { require Devel::Peek; 1 } or return;
my $gv = Devel::Peek::CvGV($in) or return;
*$gv{PACKAGE} . '::' . *$gv{NAME};
} ## end sub CvGV_name_or_bust
你可以用它来锻炼它
#! /usr/bin/perl
use warnings;
use strict;
package Foo;
sub bar {}
package main;
BEGIN { *baz = \&Foo::bar }
sub CvGV_name_or_bust { ... }
print CvGV_name_or_bust(\&baz), "\n";
输出:
富::酒吧
请注意,上面的示例给出了
Foo:bar
一个不同的名字,但是你得到了别名子所在的包和它的名字。
关于perl - 在 Perl 中,如何检查给定函数是从哪个模块导入的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3684930/