Как я могу написать скрипт Perl для извлечения исходного кода каждой подпрограммы в пакете Perl? - PullRequest
6 голосов
/ 04 июля 2011

Учитывая пакет Perl Foo.pm, например,

package Foo;

use strict;

sub bar {
    # some code here 
}

sub baz {
    # more code here 
}

1;

Как мне написать скрипт для извлечения текстового исходного кода для каждого сабвуфера, в результате чего получается хеш:

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

Я бы хотел, чтобы текст был в точности таким, каким он отображается в пакете, пробелах и прочем.

Спасибо.

Ответы [ 3 ]

16 голосов
/ 05 июля 2011

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;
4 голосов
/ 04 июля 2011

Сначала нужно выяснить, из какого пакета получена подпрограмма. В книге Perl Hacks в Hack # 58 «Поиск источника подпрограммы» рекомендуется модуль Sub::Identify.

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

Будет напечатан пакет, с которого идет саб.

Hack # 55 «Показать исходный код при ошибках» показывает, как получить исходный код на основе номеров строк (из сообщений об ошибках и предупреждений). Примеры кода можно найти здесь: пример кода

4 голосов
/ 04 июля 2011

Посмотрите на модуль PPI.

...