Как вывести операции для всех функций, используя B :: Concise - PullRequest
5 голосов
/ 17 августа 2010

Прямо сейчас я могу назвать подпрограммы printargs следующим образом, чтобы получить дамп.

perl -MO=Concise,printargs,-main,-terse Hello.pl

Если у меня есть несколько подпрограмм, как я могу создать универсальный модуль для выгрузки подробностей для всех подпрограмм?

1 Ответ

4 голосов
/ 17 августа 2010

Для выгрузки одной подпрограммы вы можете использовать

B::Concise::compile($sub)->()

где $ sub - ссылка на sub.

Если вы заранее знаете список сабов, Вы сделали, просто сделайте выше для каждого из них.

В противном случае, чтобы получить список существующих имен подпрограмм в конкретной упаковке вы всегда можете пройтись по символу таблица для этой упаковки:

no strict 'refs';
for my $k (keys %{"$pkgname\::"}) {
    if (*{${"$pkgname\::"}{$k}}{CODE}) {
        print "$k\n"; # sub name
    }
}

Обновление: моя первая строка содержала ошибку, которая исправлена сейчас. А вот полный пример скрипта:

package Blah;

sub x { return "x"; }
sub hehe { print 2*2, "\n"; }
sub meme { die "ouch" }

our $varvar; # to illustrate the {CODE} thingy

package main;
use warnings;
use strict;
use B::Concise;

my $pkgname = "Blah";
no strict 'refs';
for my $k (keys %{"$pkgname\::"}) {
    if (*{${"$pkgname\::"}{$k}}{CODE}) {
        my $sub = \&{${"$pkgname\::"}{$k}};
        print "Dump of $pkgname\::$k():\n";
        B::Concise::compile($sub)->();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...