将 Perl 从 5.6 升级到 5.24

Upgrade Perl from 5.6 to 5.24

我们目前在我们的组织中使用 5.6 版本的 Perl,以及 MySQL 和 Apache,但现在客户想要将 Perl 升级到 v5.24。

在开始升级之前必须牢记的所有主要变化和要点是什么?

我上网冲浪了很多,但我没有发现任何关于从 5.6 升级到 5.24 的有趣内容。

是否建议从这个低得多的版本升级到高级版本?

如果您查看 CPAN 上的 release page on for Perl 5.24,您会发现该文档包含许多名为 "perl5xxxdelta" 的文件。这些是每个新版本的 Perl 的发行说明。它们包含自上一个 Perl 版本以来所有更改的详细信息。

5.6 到 5.24 是一个巨大的飞跃(大约 30 个版本!)我可以看到 很多 阅读你的未来!

也许将来您会意识到保持软件版本更新一点的重要性:-)

如果您转到 CPAN 以获取您要迁移到的所选版本(在您的情况下为 5.24.0 Perl 5.24.0), and look down in the Documentation section there are bunch of perlXXXdelta links. These files describe the changes between revisions and more importantly they detail the incompatible changes. You can also find these online

版本 5.24.0 详细说明了它在 pod/perldelta.pod.

中的变化

有许多显着差异:

  • 5.8 改变了二进制格式,所以你必须重新编译.XS 模块。
  • 5.8 移至 PerlIO 进行核心 I/O 操作。
  • 5.8 更改了宽字符串的工作方式。这改变了 use utf8.
  • 的角色
  • 5.10 使 unpack()mkdir() 默认使用 $_
  • 5.10 退休 $*$#
  • 5.10 使得 $AUTOLOADprintfsprintf 现在是可污染的
  • 5.12 重新排序 @INC 以允许升级核心模块
  • 5.12 blesses 文件句柄变成IO::File
  • 5.12 suidperl 已删除
  • 5.12 已弃用 UNIVERSAL->import()
  • 5.14 是另一个二进制不兼容更改
  • 5.14 更改 glob 句柄的引用。
  • 5.14 local($_) 剥夺了 $_
  • 的所有魔法
  • 5.14:=变成语法错误
  • 5.18 哈希顺序比以前 less predictable
  • 5.18 \s 现在匹配 \cK(垂直制表符)
  • 5.18 readline() with $/ = \N 现在读取 N 个字符,而不是 N 个字节
  • 5.20 do SUBROUTINE(LIST) 变成语法错误
  • 5.20 对于某些数据结构,Data::Dumper 输出已更改
  • 5.24 词法 $_ 已删除
  • 5.24 chdir('') 不再将目录更改为 home

我建议您详细查看这些文件(考虑到您的巨大版本颠簸,这会让您忙个不停!)。如果您非常了解您的代码库及其使用的 Perl 功能,则尤其如此。这至少应该让您了解在迁移到更高版本时可能面临的潜在陷阱。

我还要补充一点,Borodin 的回答值得一读,因为它详细介绍了处理升级的非常好的方法。我完全同意他的建议,尤其是单元测试——这是增加对迁移成功的信心的可靠方法。如果您没有单元测试,那么这将是介绍它们的绝佳时机,并且能够证明为您的组织创建它们所花费的时间是合理的。

我认为自己了解差异会很有用,但要处理所有增量文件并检查所有来源是否存在差异是不可行的。

希望您对软件套件进行了单元测试。如果没有,那么现在就了解为什么它们有用,并为您拥有的一切编写综合测试。

在您的版本控制系统中创建一个分支,并将 use strictuse warnings 'all' 添加到每个源文件的顶部(如果它们尚不存在)。 运行 你的测试套件,直到一切仍然可以在 Perl v5.5 下编译并完美运行。

在测试系统上安装 Perl v5.24 并调整您的源代码,直到它们通过所有测试。

Perl 5 团队在保持向后兼容性方面表现出色,但几乎肯定会有一些人员伤亡。

当你有信心时,让新版本上线。将会有更多的失败,并且对于每一个你都必须在你的测试套件中编写一个新的测试。

Is it advisable to move from this much lower version to advanced level?

绝对是的。 Perl 5 团队非常努力地为每个版本的 Perl 删除错误和添加功能,同时在每个版本的 Perl 5 中保持 100% 的向后兼容性。

如果您遇到任何问题,那可能是因为代码可疑,或者由于新弃用的语法现在发出了警告。