我在perl程序中使用了更多模块。 例如:
use File::copy;
所以同样文件模块包含Basename,Path,stat等。 我想列出文件包模块中的所有子例程(函数)名称。
在python中有dir(modulename) 它列出了该模块中使用的所有功能.... 例: #!的/ usr / bin中/ Python的
# Import built-in module math
import math
content = dir(math)
print content
像python告诉perl中的任何代码
请提前帮助谢谢
答案 0 :(得分:3)
如果要查看perl中命名空间的内容,可以使用%modulename::
。
对于main
%main::
或%::
的{{1}}。
E.g:
#!/usr/bin/perl
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 \%::;
这涵盖了很多东西 - 包括pragma。但是你可以查看例如通过简单地测试它作为代码引用的子例程。
foreach my $thing ( keys %:: ) {
if ( defined &$thing ) {
print "sub $thing\n";
}
}
参考上面的例子,打印出来:
sub Dumper
sub carrot
sub fish
所以参考你原来的问题:
#!/usr/bin/perl
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
的一些变体可能会做您想要的。
这样的事情:
#!/usr/bin/perl
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
。无法思考为什么...... :)。
应该注意 - 只是因为你可以从模块导入一个sub(默认情况下不会导出)并不是一个好主意。按照惯例,任何以_
为前缀的子都不应该在外部使用,等等。
答案 1 :(得分:2)
我的Devel::Examine::Subs模块可以执行此操作,还有更多功能。请注意,无论它是一种方法还是一种功能都是无关紧要的,它会同时捕捉到这两种方法或功能。它完全适用于PPI中的子程序。
use warnings;
use strict;
use Devel::Examine::Subs;
my $des = Devel::Examine::Subs->new;
my $subs = $des->module(module => 'File::Copy');
for (@$subs){
print "$_\n";
}
输出:
_move
move
syscopy
carp
mv
_eq
_catname
cp
copy
croak
或文件/完整目录。对于目录中的所有Perl文件(递归),只需将dir传递给file
param,而不在路径末尾添加文件:
my $des = Devel::Examine::Subs->new(file => '/path/to/file.pm');
my $subs = $des->all;
答案 2 :(得分:1)
如果您只想打印它,请使用Data :: Dumper模块和以下方法,以CGI为例:
use strict;
use warnings;
use CGI;
use Data::Dumper;
my $object = CGI->new();
{
no strict 'refs';
print "Instance METHOD IS " . Dumper( \%{ref ($object)."::" }) ;
}
另请注意,它是File :: Copy,而不是File :: copy。