在回复之前请仔细阅读此问题,这经常被误解。
我需要一种方法来检查当前解释器中是否存在特定的包。我想可能有办法列出所有加载的包,以便我可以在该列表中搜索。我们有一个例子。这是一个简单的脚本,它定义了几个包:
#!/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'
如您所见,此处没有use
或require
。这才是重点。我不正在寻找我系统上安装的模块(可以通过遍历@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系统上找到模块文件 。如果由于复制和粘贴而继续使用错误的软件包名称,则会出现难以跟踪的方法未找到的错误。同样地,在类似情况下,我对来自超类的重写方法有一些奇怪的错误。
答案 0 :(得分:4)
走符号表。
从%::
开始,查看名称本身以::
结尾的所有密钥,并递归。
答案 1 :(得分:3)
<?php error_reporting(E_ALL); ini_set('display_errors', 1); // rest of your code