Perl中相当于Python dir的是什么?

6 投票
5 回答
646 浏览
提问于 2025-04-21 07:47

在Python 2.7.x中,dir命令可以列出一个模块中所有可以访问的“符号”。那么在Perl 5.x中,有没有类似的方式可以列出一个包中所有可以访问的“符号”呢?

5 个回答

0

Python

非常喜欢在Python中你可以这样做:

print(dir(my_object))

这样就会打印出你可以在对象上使用的所有方法。

回到Perl

在网上找了一会儿,没找到用标准包的解决方案,我决定自己写一个。(Devel::Symdump看起来是个不错的解决方案,但它不在标准的Perl库里)。

如果有更好的方法或者我可以做的更新,请告诉我。

# --- 安装 "dir" 方法 --- #

#!/usr/bin/perl -l

use v5.32;

sub UNIVERSAL::dir{
   my ($s)   = @_;               # class or object  
   my $ref   = ref $s;
   my $class = $ref ? $ref : $s; # myClass
   my $pkg   = $class . "::";    # MyClass::
   
   no strict 'refs';
   my @keys =
      grep { defined $pkg->{$_}->*{CODE} }
      sort keys %$pkg;

   return @keys if defined wantarray;  

   local $" = ', ';              # join separator
   print "$class: [@keys]";
}

# --- 创建一个示例类 --- #

package MyClass {
   sub new {bless {}, shift}
   sub func1{}
   sub func2{}
}

# --- 使用方法 --- #

# Class method
MyClass->dir;        # MyClass: [func1, func2, new]

# Object method
my $obj = MyClass->new;
$obj->dir;           # MyClass: [func1, func2, new]
print for $obj->dir; # [func1, func2, new]
0

Devel::Symdump这个包的功能就是这样。为了演示一下,这里是它自己输出的内容:

$ perl -M'Devel::Symdump' -e 'print(Devel::Symdump->new("Devel::Symdump")->as_string)'
arrays

functions
    Devel::Symdump::AUTOLOAD
    Devel::Symdump::DESTROY
    Devel::Symdump::_doit
    Devel::Symdump::_inh_tree
    Devel::Symdump::_isa_tree
    Devel::Symdump::_partdump
    Devel::Symdump::_symdump
    Devel::Symdump::as_HTML
    Devel::Symdump::as_string
    Devel::Symdump::diff
    Devel::Symdump::inh_tree
    Devel::Symdump::isa_tree
    Devel::Symdump::new
    Devel::Symdump::rnew
hashes

ios
    Devel::Symdump::ENTRY
packages

scalars
    Devel::Symdump::AUTOLOAD
    Devel::Symdump::BEGIN
    Devel::Symdump::DESTROY
    Devel::Symdump::Defaults
    Devel::Symdump::ENTRY
    Devel::Symdump::MAX_RECURSION
    Devel::Symdump::VERSION
    Devel::Symdump::_doit
    Devel::Symdump::_inh_tree
    Devel::Symdump::_isa_tree
    Devel::Symdump::_partdump
    Devel::Symdump::_symdump
    Devel::Symdump::as_HTML
    Devel::Symdump::as_string
    Devel::Symdump::diff
    Devel::Symdump::import
    Devel::Symdump::inh_tree
    Devel::Symdump::isa_tree
    Devel::Symdump::new
    Devel::Symdump::rnew
unknowns

你还可以选择输出为HTML格式,或者获取特定类型的符号列表(比如标量、函数等等)。

不过要注意,AUTOLOAD的符号只有在被加载后才会被输出。如果你想查看所有可能存在的符号,建议你查看相关的文档或者源代码。

1

对于包 h

package h; 
our $r; 

use Data::Dumper;
print Dumper \%h::;
3

你可以自己动手,翻找这个包的符号表,找到你需要的信息。不过,使用Devel::Symdump会简单很多。

6
say for sort keys %Foo::Bar::;

你可以使用

*Foo::Bar::sym{SCALAR}
*Foo::Bar::sym{ARRAY}
*Foo::Bar::sym{HASH}
etc

来查看这个符号是否有一个指定类型的变量和它关联。

撰写回答