我可以从任何Perl模块动态获取函数或函数名列表吗?

Ric*_*ões 7 perl perl-module

我想从我的系统上可用的任意Perl模块动态获取函数名称(作为字符串)或函数引用的列表.这将包括可能具有或不具有的模块,例如@EXPORT_OK其命名空间中的全局数组.这样的壮举有可能吗?如果是这样的话怎么把它拉下来?

编辑:从阅读perlmod,我看到它%Some::Module::作为符号表Some::Module.这是正确的地方吗?如果是这样,我怎样才能将表格缩小到只有函数名称Some::Module

Eth*_*her 8

您可以找到这个简单的脚本:

#!/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}::"});
}
Run Code Online (Sandbox Code Playgroud)

但是,如果你在生产代码中这样做,我会改用Package :: Stash:

my @subs_in_foo = Package::Stash->new('Foo')->list_all_symbols('CODE');
Run Code Online (Sandbox Code Playgroud)


DVK*_*DVK 8

你走在正确的轨道上.为了将整个符号表简化为sub,可以完成类似的事情(Hat tip"Mastering Perl",第8章,主要包版本):

use strict; # need to turn off refs when needed
package X;

sub x {1;};
sub y {1;};
our $y = 1;
our $z = 2;

package main;

foreach my $entry ( keys %X:: ) {
    no strict 'refs';
    if (defined &{"X::$entry"}) {
        print "sub $entry is defined\n" ;
    }
}

# OUTPUT
sub y is defined
sub x is defined
Run Code Online (Sandbox Code Playgroud)