请在回复之前仔细阅读此问题,它经常被误解。
我需要一种方法来检查当前解释器中是否存在特定包。我想可能有一种方法可以列出所有已加载的包,以便我可以在该列表中进行搜索。让我们举个例子。这是一个简单的脚本,它定义了几个包:
#!/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
定义的包。陈述。我想这相当于谈论定义的 namespace 列表。这有什么好处?
事情是这样的。在一个相当大的项目中,我经常发现自己在重构模块的结构。这包括移动或重命名模块/包。从
Util::Foo
重命名模块时至Util::Bar
, 必须做 3 件事。Util/Foo.pm
重命名至Util/Bar.pm
package Util::Foo;
修改 package 语句至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 系统上,找到了一个模块文件。如果我由于复制和粘贴而继续使用错误的包名称,则会出现方法未找到的错误,这些错误很难追踪。同样,在这种情况下,对于父类(super class)中的重写方法,我也遇到了奇怪的错误。
最佳答案
走符号表。
从%::
开始并查看名称本身以 ::
结尾的所有键, 并递归。
关于perl - 列出所有已加载/定义(未安装)的包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31099749/