perl - perl 包是自动生成的吗?它们究竟是如何工作的?

标签 perl

我想弄清楚是否可以动态创建一个 Perl 包,所以我写了一个简单的测试程序。

eval "package foobar;";

$foobar::baz = 4;
print $foobar::baz;

程序打印4。然后我试了一下

use strict;
use warnings FATAL => 'all';

eval "package foobar;";

$foobar::baz = 4;
print $foobar::baz;

程序没有崩溃也没有被拒绝(并且仍然打印 4),尽管 foobar 包直到运行时才知道存在.

然后我试了一下

use strict;
use warnings FATAL => 'all';

$foobar::baz = 4;
print $foobar::baz;

并且 Perl 仍然愉快地打印 4

我现在彻底糊涂了。我一直认为包必须明确创建,而不是突然出现。它们究竟是如何工作的?当一个包被“使用”而不是通过 package 被“声明”时,是否有 pragma 可以发出警告?

最佳答案

从某种意义上说,包只不过是恰好是符号表的散列中的键。在示例代码中设置 $foobar::baz 后,您可以通过检查散列 %foobar:: 来查看这一点。之后,您可以开始查看 %::。通过直接弄乱符号表,可以做一些有趣的(以及难以理解和调试的)事情。

要阅读所有这些的文档页面是 perlmod

关于perl - perl 包是自动生成的吗?它们究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34505847/

相关文章:

regex - 如何在 awk 命令中支持不常见的字符

perl - 为 SublimeLinter 添加 Perl 库的自定义路径

perl - 在简单的 Perl 教程中为模块添加包含路径

regex - Bareword 在 Perl 脚本中的错误处找到了运算符(operator)预期的位置

mongodb - 如何捕获 Perl MongoDB 驱动程序的连接错误?

Perl 循环遍历哈希会产生奇怪的值

perl - 为什么补充搜索列表不起作用?

apache - 使用 dispatch.cgi 运行 CGI 时出现 perl Dancer 问题

perl - 为什么我的 -p one-liner 打印出我想跳过的行?

windows - 如何在 Windows 上的 Perl 中获取目录的最后修改时间?