列出所有加载/定义的包(未安装)

时间:2015-06-28 12:23:50

标签: perl

在回复之前请仔细阅读此问题,这经常被误解。

我需要一种方法来检查当前解释器中是否存在特定的。我想可能有办法列出所有加载的包,以便我可以在该列表中搜索。我们有一个例子。这是一个简单的脚本,它定义了几个包:

#!/path/to/perl

package Foo;

# some code in package Foo

package Bar;

# some code in package Bar

package main;

# main program. Want to have a list which includes 'Foo' and 'Bar'

如您所见,此处没有userequire。这才是重点。我正在寻找我系统上安装的模块(可以通过遍历@INC列出这些模块)。我也没有找到require d的模块%INC中列出的那些)。我想要一个运行时可用的列表,即已使用package语句定义的列表。我想这相当于说出已定义的名称空间列表

这有什么用呢?

事情就是这样。在一个相当大的项目中,我经常发现自己重构了模块的结构。这包括移动或重命名模块/包。将模块从Util::Foo重命名为Util::Bar时,必须完成3件事。

  • 将模块从Util/Foo.pm重命名为Util/Bar.pm
  • 将包语句从package Util::Foo;修改为package Util::Bar;
  • use条款从use Util::Foo;更改为use Util::Bar;

如果我执行步骤1和3,但忘记修改package语句,则会加载模块Util::Bar,但未定义包Util::Bar。相反,仍然定义了Util::Foo包。这会在运行脚本时导致奇怪的,难以理解的警告/错误。 Perl不会指出明显的错误,因为在另一个名称的模块中定义一个包在Perl中是完全合法的。

我遇到的另一个奇怪之处是我在use条款中出现了区分大小写错误。如果我有一个模块FooBar正确定义了包FooBar,但我use模块/包Foobar(小写b),我在Unix上得到一个即时错误系统,因为找不到模块文件,但在Windows系统上找到模块文件 。如果由于复制和粘贴而继续使用错误的软件包名称,则会出现难以跟踪的方法未找到的错误。同样地,在类似情况下,我对来自超类的重写方法有一些奇怪的错误。

2 个答案:

答案 0 :(得分:4)

走符号表。

%::开始,查看名称本身以::结尾的所有密钥,并递归。

答案 1 :(得分:3)

使用Devel::Symdump

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code
相关问题