perl - Perl 版本中有哪些向后不兼容的具体示例?

标签 perl compatibility backwards-compatibility language-history

从 Perl 1.0 的首次公开发布(1987 年 12 月 18 日)到当前的稳定版本 5.10.1(2009 年)已经 22 年了。

在这 22 年中,发布了以下值得注意的版本:

  • Perl 1.0(1987 - 初始版本)
  • Perl 2(1988 - 更好的正则表达式)
  • Perl 3(1989 - 支持二进制数据流)
  • Perl 4(1991 - 标识 Camel 书中描述的 Perl 版本)
  • Perl 5(1994 - 引入了重大变化,解释器几乎完全重写)
  • Perl 5.6(2000 - 64 位支持,Unicode 字符串,大文件支持)
  • Perl 5.8(2002 - 改进的 unicode 支持,新的 IO 实现)
  • Perl 5.10(2007 - 新的 switch 语句、正则表达式更新、智能匹配运算符)

  • 我正在寻找 Perl 历史中向后不兼容的具体示例。

    问题:
  • 在 Perl 的 22 年历史中,是否有任何 Perl 向后不兼容的示例,其中针对 Perl 版本 X 的 Perl 源代码不会在版本 Y(其中 Y > X)下运行?

  • 请尽可能包括引用资料和代码示例。

    最佳答案

    最大的故意不兼容之一是数组插值,它在 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 中没有改变。 Larry Wall noticed and did the equivalent of OMG YER DOIN IT WRONG!!!新的 Perl 6 版本被认为明显更好,因此 5.10.1 修复了它。

    关于perl - Perl 版本中有哪些向后不兼容的具体示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1855493/

    相关文章:

    linux - 重命名文件和目录(添加前缀)

    linux - 使用perl脚本在linux中杀死多个进程

    android - 是否已在所有 Android 手机上修复 AAC+ 支持?

    java - 增强 Java 8 的库,同时保持向后兼容性

    perl+ VBA : raise click event on a button embedded in a Powerpoint slide

    windows - Perl 5.12 使用为 Perl 5.6 创建的 DLL 加载模块

    css - 如何使我的 Web 应用程序在 IE 8 和 9 中看起来正确?

    android - Yii 框架和 Android 应用程序

    iphone - 在不同的 iOS SDK 下编译一个 iphone 应用程序

    javascript - jQuery 支持向后兼容性的程度如何?