将 Perl 从 5.6 升级到 5.24
Posted
技术标签:
【中文标题】将 Perl 从 5.6 升级到 5.24【英文标题】:Upgrade Perl from 5.6 to 5.24 【发布时间】:2016-12-19 05:29:50 【问题描述】:我们目前在我们的组织中使用 5.6 版本的 Perl,以及 mysql 和 Apache,但现在客户想要将 Perl 升级到 v5.24。
开始升级之前必须牢记的所有主要变化和关键点是什么?
我经常上网,但没有发现从 5.6 升级到 5.24 的任何有趣内容。
从这个低得多的版本升级到高级版本是否可取?
【问题讨论】:
List of Perl 5 versions(日期为 1996-02-03 至 2020-11-20。446 个版本)。 虽然有点简洁。例如,很难通过重命名命令字母来推断 Perl 调试器文档 损坏在版本 5.7.3 (2002-03-05) 中。书Programming Perl(“骆驼书”),第4版,10年后(2012-02-13)出版,没有变化(现在仍然没有 i> 在勘误表中 - 这是超过 18 年,一种规范文档已经过时)。第 613 页也存在复制粘贴错误,信息被覆盖/丢失。 @brian d foy:例如,第 605 页(第三版,2013-12-13)声称“w”命令将显示源代码的“窗口”。对于更高版本的 Perl,情况并非如此。 'w' 现在用于“watch”(条件断点)。用于在给定源代码行周围列出几行的 new 命令是“v”。 【参考方案1】:如果您转到 CPAN 以选择您要迁移到的版本(在您的情况下为 5.24.0 Perl 5.24.0),然后在 Documentation 部分向下看,有一堆 perlXXXdelta
链接。这些文件描述了修订之间的更改,更重要的是,它们详细说明了不兼容的更改。你也可以找到这些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 使 $AUTOLOAD
、printf
和 sprintf
现在是可污染的
5.12 重新排序 @INC
以允许升级核心模块
5.12 祝福文件句柄变成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()
和 $/ = \N
现在读取 N 个字符,而不是 N 个字节
5.20 do SUBROUTINE(LIST)
成为语法错误
5.20 对于某些数据结构,Data::Dumper
输出已更改
5.24 词法 $_
已删除
5.24 chdir('')
不再将目录更改为主目录
我建议您详细查看这些文件(考虑到您的巨大版本问题,这会让您忙得不可开交!)。如果您对代码库及其使用的 Perl 功能有很好的了解,情况尤其如此。这至少应该让您了解在迁移到更高版本时可能面临的潜在陷阱。
我还要补充一点,Borodin 的回答值得一读,因为它详细介绍了处理升级的非常好的方法。我完全同意他的建议,尤其是单元测试——这是增加对迁移成功的信心的可靠方法。如果您没有单元测试,那么这将是介绍它们的绝佳时机,并且能够证明为您的组织创建它们所花费的时间是合理的。
【讨论】:
【参考方案2】:我认为对差异进行自我教育会很有用,但是不可能通过所有的 delta 文件来检查所有来源的差异。
希望您的软件套件有单元测试。如果没有,那么现在就了解它们为什么有用并为您拥有的所有内容编写全面的测试。
在您的版本控制系统中创建一个分支,并将use strict
和use warnings 'all'
添加到每个源文件的顶部(如果它们还没有的话)。运行您的测试套件,直到一切仍然可以编译并在 Perl v5.5 下完美运行。
在测试系统上安装 Perl v5.24 并调整您的源代码,直到它们通过所有测试。
Perl 5 团队在保持向后兼容性方面表现出色,但几乎肯定会有一些人员伤亡。
当您有信心时,让新版本上线。将会有更多的失败,并且对于每一个你都必须在你的测试套件中编写一个新的测试。
【讨论】:
【参考方案3】:从这个低得多的版本升级到高级版本是否可取?
绝对是的。 Perl 5 团队非常努力地消除错误并为每个 Perl 版本添加功能,同时在每个 Perl 5 版本中保持 100% 的向后兼容性。
如果您遇到任何问题,那可能是因为代码可疑,或者因为新弃用的语法而现在发出警告。
【讨论】:
【参考方案4】:如果您查看 CPAN 上的 release page on for Perl 5.24,您会看到文档包含许多名为“perl5xxxdelta”的文件。这些是每个新版本 Perl 的发行说明。它们包含自上一版本 Perl 以来发生变化的所有细节。
5.6 到 5.24 是一个巨大的飞跃(大约 30 个版本!)我可以看到你的未来大量阅读!
也许将来您会意识到保持软件版本更新的重要性 :-)
【讨论】:
我制作了九个主要的公共版本,这已经足够了。我认为计算次要版本和开发版本是不诚实的。 我没有计算开发版本。或在下一个主要版本之后发布的次要版本。但我认为计算次要版本是公平的(因为那时你至少应该考虑升级)。经过更仔细的重新计算,我将其设为 34 个版本。但是,是的,“只有”九个主要版本。 九个就足够了 :) 但我不希望我的团队在每次增量时都进行升级,除非是为了修复错误。大部分东西都在工作,升级通常只提供新的亮点(尽管我尽量保持 v5.10 的基础)。以上是关于将 Perl 从 5.6 升级到 5.24的主要内容,如果未能解决你的问题,请参考以下文章
带有 MySQL 5.6 的 Solaris 10 中的 MySQL 性能问题
将 Laravel 从 5.6 升级到 6.0 后,调用未定义的 str_random() 函数不起作用
升级过程中从 5.6 到 5.7 的 AWS RDS MySQL 复制
将 mysql 从 5.6 升级到 5.7 后“在用户表中找不到任何匹配的行”
Laravel 从 5.5 升级到 5.6 到 5.7:未捕获 ReferenceError: axios is not defined