Loading...

查找 Perl Package 和 Subroutine

应用集合1年前 (2024)更新 ICSteve
158 0

当我们开始使用他人的 Perl 程序或包时,我们希望看到 Perl 子程序的源代码。

以下是 Steve’s Practice 寻找Package 和Subroutine 根源的做法。内容来自网络并在本地环境运行通过。

查找 Perl Package 和 Subroutine

 

Find Package

将下面的代码保存到文件fine_pm, 并更改为可执行文件。

然后使用命令 find_pm <module name> 来寻找module.

#!/usr/bin/env perl

use strict;
use warnings;

my $sub_path = shift @ARGV;

if (not defined $sub_path)
{
  print "\nERROR: No arguments supplied.\n\n";
  print "Syntax: find_pm [Perl Module]\n\n";

  exit 1;
}

my $sub_path_orig = $sub_path;
$sub_path =~ s/::/\//g;

foreach my $lib_path (@INC)
{
  my $full_path = "$lib_path/$sub_path";
  if ($full_path !~ /\.pm$/)
  {
    $full_path .= ".pm";
  }
#   print "DEBUG: $full_path\n";
  if (-e $full_path)
  {
    print "$full_path\n";
    exit 0;
  }
}

print "$sub_path_orig: module not found\n";

Find Subroutine

下面这个代码来帮助找到 subroutine,代码会打印出定义这个subroutine 的源文件以及行号。

use mypl ;

sub find_sub (\&) {
    my $code = shift;
    require B;
    my $obj = B::svref_2object($code);  # create a B::CV object from $code

    print "$code:\n";

    print "  $$_[0]: $$_[1]\n" for
        [file    => $obj->FILE],
        [line    => $obj->GV->LINE],
        [name    => $obj->GV->NAME],
        [package => $obj->STASH->NAME];
}

find_sub &::mypl::dev_test ;

© 版权声明

相关文章

暂无评论

暂无评论...