Python 2.7.x中的dir
命令列出了所有可访问的符号'来自一个模块。
是否在Perl 5.x中列出了所有可访问的符号'从包裹?
答案 0 :(得分:5)
say for sort keys %Foo::Bar::;
您可以使用
*Foo::Bar::sym{SCALAR}
*Foo::Bar::sym{ARRAY}
*Foo::Bar::sym{HASH}
etc
查看符号是否具有与之关联的指定类型的变量。
答案 1 :(得分:3)
您可以通过在包装的符号表中搜索来完成所有操作。但Devel::Symdump使这一切变得容易多了。
答案 2 :(得分:1)
对于包h
,
package h;
our $r;
use Data::Dumper;
print Dumper \%h::;
答案 3 :(得分: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或获取特定类型的符号列表(标量,函数等)。
但请注意,除非已加载AUTOLOADed符号,否则不会转储这些符号。如果您想查看所有可能的符号,您需要查看文档和/或源代码。
答案 4 :(得分: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]