perl - 在 Perl 中,如何检查给定函数是从哪个模块导入的?

标签 perl function module subroutine

我有一个调用该函数的代码。但我不知道这个函数属于哪个模块。我需要它来修改这个功能。

我怎样才能检查它?

最佳答案

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/

相关文章:

linux - 如何使用 perl 脚本将单个日志从 linux 服务器读取到另一个日志文件

linux - 如何抑制从已加载模块代码中发出的 Perl 警告?

python - 模块未找到错误: No module named 'my_app'

function - R,单独的参数函数,可导出自己的在线帮助

r - R重复功能,直到满足条件

module - 覆盖 Magento 自定义模块中的核心 Controller

python - 重新缩放给定最大值和最小值之间的值,其中最大值为正,最小值为负

python - 对文件夹和分段数据库中的所有文件名运行 bat 脚本并合并输出的命令

regex - perl - 将字符串拆分为 2 个字符的组

javascript - javascript 中的默认实例函数调用