How can I write a Perl script to extract the source code of each subroutine in a Perl package?

只谈情不闲聊 提交于 2019-11-27 03:32:59

问题


Given a Perl package Foo.pm, e.g.

package Foo;

use strict;

sub bar {
    # some code here 
}

sub baz {
    # more code here 
}

1;

How can I write a script to extract the textual source code for each sub, resulting in a hash:

$VAR1 = {
    'bar' => 'sub bar {
        # some code here 
    }',
    'baz' => 'sub baz {
        # more code here 
    }'
};

I'd like to have the text exactly as it appears in the package, whitespace and all.

Thanks.


回答1:


PPI is kind of a pain to work with at the very first; the documentation is not good at telling you which class documents which methods shown in the examples. But it works pretty well:

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;



回答2:


First you need to find out, what package the subroutine resulted from. The book Perl Hacks in Hack #58 'Find a Subroutine's Source' recommends module Sub::Identify.

use Sub::Identify ':all';
print stash_name ( \&YOURSUBROUTINE );

This will print the package, the sub is coming from.

Hack #55 'Show Source Code on Errors' shows how to retrieve the source code based on line numbers (from error and warning messages). The code examples can be found here: example code




回答3:


Take a look at the PPI module.



来源:https://stackoverflow.com/questions/6575224/how-can-i-write-a-perl-script-to-extract-the-source-code-of-each-subroutine-in-a

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!