如何编写Perl脚本来提取Perl包中每个子例程的源代码?

nic*_*ick 6 perl parsing extract package subroutine

给出一个Perl包Foo.pm,例如

package Foo;

use strict;

sub bar {
    # some code here 
}

sub baz {
    # more code here 
}

1;
Run Code Online (Sandbox Code Playgroud)

如何编写脚本来提取每个sub的文本源代码,从而产生一个哈希:

$VAR1 = {
    'bar' => 'sub bar {
        # some code here 
    }',
    'baz' => 'sub baz {
        # more code here 
    }'
};
Run Code Online (Sandbox Code Playgroud)

我希望文本与包,空白和所有内容完全一致.

谢谢.

yst*_*sth 17

PPI在一开始就有点痛苦; 文档不擅长告诉你哪些类文档在示例中显示了哪些方法.但它运作得很好:

use strict;
use warnings;
use PPI;

my %sub; 
my $Document = PPI::Document->new($ARGV[0]) or die "oops";
for my $sub ( @{ $Document->find('PPI::Statement::Sub') || [] } ) {
    unless ( $sub->forward ) {
        $sub{ $sub->name } = $sub->content;
    }
}

use Data::Dumper;
print Dumper \%sub;
Run Code Online (Sandbox Code Playgroud)


hex*_*der 5

首先,您需要找出子程序生成的包。本书《Perl Hacks in Hack#58'Find a Subroutine's Source'》推荐模块Sub::Identify

use Sub::Identify ':all';
print stash_name ( \&YOURSUBROUTINE );
Run Code Online (Sandbox Code Playgroud)

这将打印包,子包来自。

Hack#55“显示错误时显示源代码”展示了如何基于行号(从错误和警告消息中)检索源代码。可以在这里找到代码示例:示例代码