列出perl程序中的所有子例程名称

时间:2015-09-28 10:30:08

标签: python perl perl-module

我在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中的任何代码

请提前帮助谢谢

3 个答案:

答案 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。