Могу ли я динамически получить список функций или имен функций из любого модуля Perl? - PullRequest
7 голосов
/ 10 декабря 2010

Я хотел бы динамически получать список имен функций (в виде строк) или ссылок на функции из любого произвольного модуля Perl, доступного в моей системе.Это будет включать в себя модули, которые могут иметь или не иметь, например, глобальный массив @EXPORT_OK в своем пространстве имен.Возможен ли такой подвиг?Как это сделать, если так?

Редактировать: Из чтения perlmod я вижу, что %Some::Module:: служит таблицей символов для Some::Module.Это правильное место для поиска?Если так, как я могу сократить таблицу до имен только функций в Some::Module?

Ответы [ 3 ]

8 голосов
/ 10 декабря 2010

Вы на правильном пути.Чтобы свести полную таблицу символов к только сабвуферам, можно сделать что-то подобное (Шляпная подсказка «Освоение Perl», гл. 8, для основной версии этого пакета):

8 голосов
/ 10 декабря 2010

Вам может пригодиться этот простой скрипт:

#!/usr/bin/env perl
use strict;
use warnings;    
use Data::Dumper;

# dump of object's symbol table:
foreach my $className (@ARGV)
{
    print "symbols in $className:";

    eval "require $className";
    die "Can't load $className: $@" if $@;

    no strict 'refs';
    print Dumper(\%{"main::${className}::"});
}

Но, если вы делаете это в рабочем коде, я бы использовал Package :: Stash вместо:

my @subs_in_foo = Package::Stash->new('Foo')->list_all_symbols('CODE');
0 голосов
/ 19 мая 2017

Я использую Perl 5.20. Это работает на моей машине:

use strict;

package foo;
   our $some_var;
   sub func1 { return 'func1'}
   sub func2 { return 'func2'}

package main;
   sub callable {
      my ($x) = @_;
      return defined(&$x);
   }

   while (my ($k, $v) = each(%foo::)) {
      if (callable($v)) {
         print("$k\n");
      }
   }

   # output:
   # func1
   # func2
...