如果您想查看Perl命名空间的内容,可以使用%modulename::
。
对于main
,可以使用%main::
或%::
。
例如:
use strict;
use warnings;
use Data::Dumper;
sub fish {};
sub carrot {};
print "Stuff defined in Dumper:\n";
print Dumper \%Data::Dumper::;
print "Stuff defined:\n";
print Dumper \%::;
虽然这覆盖了很多内容,包括编译指示。但是您可以通过测试它是否为代码引用来检查例如子程序。
foreach my $thing ( keys %:: ) {
if ( defined &$thing ) {
print "sub $thing\n";
}
}
参考上面的示例,这将打印:
sub Dumper
sub carrot
sub fish
关于你最初的问题:
use strict;
use warnings;
use Data::Dumper;
use File::Copy;
print "File::Copy has subs of:\n";
foreach my $thing ( keys %File::Copy:: ) {
if ( defined &$thing ) {
print "sub $thing\n";
}
}
很遗憾,你不能像整个File::
命名空间一样做同样的事情,因为有许多不同的模块可能已经安装/加载,但也可能没有。
你需要使用例如CPAN来检查 -
perl -MCPAN -e shell
i /^File::/
这将列出大约717个模块,这些模块被分组到File::
树中。
您可以在CPAN
上查找此信息。或者,如果您只需要核心模块,则可能使用Module::CoreList
的某个变体就可以满足您的需求。
例如:
use strict;
use warnings;
use Module::CoreList;
foreach my $module ( Module::CoreList->find_modules(qr/^File::/) ) {
if ( eval { require $module =~ s|::|/|gr . ".pm" } ) {
print "Module: $module contains\n";
my $key_str = "\%$module\:\:";
my %stuff = eval $key_str;
foreach my $thing ( sort keys %stuff ) {
my $full_sub_path = "$module::$thing";
if ( eval {"defined &$full_sub_path"} ) {
if ( defined &$thing ) {
print "$thing <- $full_sub_path imported by default\n";
}
else {
print "\t$full_sub_path might be loadable\n";
}
}
}
}
else {
print "Module: $module couldn't be loaded\n";
}
}
由于必须在运行时eval
各个部分以测试模块是否实际存在且可加载,所以有点混乱。奇怪的是,File::Spec::VMS
在我的Win32
系统上不存在。想不出为什么.... :).
应该注意的是 - 仅仅因为您可以从模块中导入子模块(默认情况下未导出)并不意味着这是一个好主意。按照惯例,任何以_
为前缀的子模块都不应在外部使用等。
Devel::Examine::Subs
。 - Håkon Hægland