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

标签 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 定义的包。陈述。我想这相当于谈论定义的 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/

    相关文章:

    perl - 检测如何在 Perl 中调用子程序

    perl - 如何管理 Perl 应用程序开发、构建和部署?

    perl - 快速打印美元负值的方法

    bash - 在 Bash 中转写十六进制字符

    linux - Perl 加密 STDIN 密码

    perl - 显示对象数组中的数据

    perl - Perl 中 localtime 函数的反面是什么?

    Perl - 将文件中的记录加载到哈希中

    perl - 在 Perl 中找不到导出的子例程

    Perl:如果文件中不存在特定行则退出