最大的故意不兼容之一是数组插值,它在 Perl 4 和 Perl 5 之间发生了变化。
my @example = qw(1 2 3);
print "foo@example.com";
在 Perl 4 中,这将是:
foo@example.com
在 Perl 5 中,这将是:
foo1 2 3.com
幸运的是,如果数组不存在,Perl 会警告您“可能的意外插值”。
线程在 5.005 和 5.6 之间发生了很大变化。“5005 个线程”使用了共享所有全局数据的传统 POSIX 线程模型。虽然理论上这更快,因为那时 Perl 可以只使用 POSIX 线程,但对于 Perl 编码人员来说这是一场噩梦。大多数 Perl 模块都不是线程安全的。它从来没有真正运作良好。
在 5.6 中,ActiveState 和其他人在 Windows 上制作了 fork()。当你在 Windows 上 fork() 时,Perl 会复制解释器对象并运行两个解释器的操作码。这被称为“多重性”。
在 5.8 中,Arthur Bergman 使用它来创建 ithread。因为多重性正在模拟一个单独的过程,所以默认情况下不共享任何数据。只有您所说的共享数据是共享的。这使得它们使用起来更加安全,尽管 ithread 需要很长时间才能稳定。像 Elizabeth Mattijsen 和 Jerry Hedden 这样的人做到了这一点。
5005 个线程最终在 5.10.0 中被删除。存在一个兼容层,但我怀疑它是否真的可以在生产代码中工作。
另一个大的不兼容来自 5.6 和 5.8 之间的 Unicode。5.6 中的 Unicode 自爆。字符串是否为 Unicode 由周围的范围决定。它在 5.8 中完全重新设计,所以现在字符串的 Unicodeiness 与字符串相关联。使用 5.6 的 Unicode 编写的代码通常必须在 5.8 中重写,通常是因为要让 5.6 的 Unicode 正常工作,您必须进行丑陋的 hack。
最近,5.10.1 对智能匹配进行了一系列不兼容的更改。幸运的是,它们是在 5.10.0 中引入的,所以没什么大不了的。Perl 6 引入了智能匹配概念,并将其向后移植到 Perl 5 的开发版本。时间流逝,Perl 6 的智能匹配概念发生了变化。没有人告诉 Perl 5 的人,它在 5.10.0 中没有改变。 拉里·沃尔注意到并做了类似天哪,你做错了!!! 新的 Perl 6 版本被认为明显更好,因此 5.10.1 修复了它。