繁体   English   中英

在 perl 中等效的 Python 目录?

[英]Python dir equivalent in perl?

Python 2.7.x 中的dir命令列出了模块中所有可访问的“符号”。 Perl 5.x 中是否有等效项来列出包中所有可访问的“符号”?

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

您可以使用

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

查看符号是否具有与其关联的指定类型的变量。

您可以通过在包的符号表中翻找来完成这一切。 但是Devel::Symdump使这一切变得容易多了。

对于包h

package h; 
our $r; 

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

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 格式输出或获取特定类型符号(标量、函数等)的列表。

但是请注意,除非已加载,否则不会转储 AUTOLOADed 符号。 如果您想查看所有可能的可用符号,您需要查看文档和/或源代码。

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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM