【问题标题】:Python dir equivalent in perl?perl中的Python dir等效?
【发布时间】:2014-11-06 17:39:46
【问题描述】:

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

【问题讨论】:

    标签: python perl


    【解决方案1】:
    say for sort keys %Foo::Bar::;
    

    你可以使用

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

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

    【讨论】:

    • 来自类似于env MODULE=Foo::Bar bash -c 'perl -e "use v5.10; use $MODULE; say for sort keys %${MODULE}::"'的命令行
    【解决方案2】:

    您可以通过在包的符号表中翻找来自己完成所有操作。但是Devel::Symdump 让这一切变得容易得多。

    【讨论】:

      【解决方案3】:

      对于包h

      package h; 
      our $r; 
      
      use Data::Dumper;
      print Dumper \%h::;
      

      【讨论】:

        【解决方案4】:

        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 符号。如果您想查看所有可用的可能符号,您需要查看文档和/或源代码。

        【讨论】:

          【解决方案5】:

          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]
          

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-30
          • 1970-01-01
          • 2014-06-15
          • 2011-09-27
          • 2013-05-12
          • 1970-01-01
          相关资源
          最近更新 更多