我想从我的系统上可用的任意Perl模块动态获取函数名称(作为字符串)或函数引用的列表.这将包括可能具有或不具有的模块,例如@EXPORT_OK
其命名空间中的全局数组.这样的壮举有可能吗?如果是这样的话怎么把它拉下来?
编辑:从阅读perlmod,我看到它%Some::Module::
作为符号表Some::Module
.这是正确的地方吗?如果是这样,我怎样才能将表格缩小到只有函数名称Some::Module
?
您可以找到这个简单的脚本:
#!/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)
你走在正确的轨道上.为了将整个符号表简化为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)
归档时间: |
|
查看次数: |
4567 次 |
最近记录: |