从Perl 1。0(1987年12月18日)的首次公开发布到目前的稳定版本5.10.1(2009),已经有22年了。
在这22年中,出现了以下值得注意的版本:
我正在寻找Perl历史中向后兼容性的具体示例。
问题:
请尽可能包含参考和代码示例。
答案 0 :(得分:14)
最大的故意不兼容性之一是数组插值,它在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)用它来运行并用它来创造ithreads。由于多重性正在模拟单独的进程,因此默认情况下不共享任何数据。只共享您说的数据。这使得它们使用起来更安全,尽管在ithreads稳定之前需要很长时间。像Elizabeth Mattijsen和Jerry Hedden这样的人实现了这一目标。
5005线程最终在5.10.0中被删除。存在兼容性层,但我怀疑它在生产代码中是否真的有效。
另一个很大的不兼容性来自于5.6和5.8之间的Unicode。 5.6中的Unicode自爆。字符串是否是Unicode是由周围的范围决定的。它在5.8中完全重新设计,所以现在字符串的Unicodey与字符串相关联。使用5.6的Unicode编写的代码通常必须在5.8中重写,通常是因为要使5.6的Unicode工作正常,你必须做丑陋的黑客攻击。
最近,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修复了它。
答案 1 :(得分:12)
Pseudo-hashes是我脑海中最近的一个例子。通常,perldelta files概述了特定版本中不兼容的更改。这些变化几乎总是模糊(如伪哈希)或小。
答案 2 :(得分:11)
是。有许多,虽然他们通常很小。有时这是由于弃用周期最终以删除结束。有时它是由于改变新(和实验)特征的语义。有时它会修复无法正常工作的错误。 Perl开发人员尽可能地保持版本之间的向后兼容性。我记不起有一个脚本因为升级到新版本的Perl而被破坏。
内部哈希顺序已多次更改。虽然这不是你应该依赖的东西,但是如果你不知不觉就会引起问题。
主要(5.x)版本之间的二进制不兼容性很常见,但这通常只意味着需要重新编译任何XS扩展。
完整列表太长,无法在此列出。您可以通过查看每个版本的history的“不兼容的更改”部分来获取它。
答案 3 :(得分:5)
OTOH有一些可追溯到Perl 1的野性功能仍然可以使用。例如,这是什么打印?
%foo = (foo => 23);
print values foo
那是对的,23。为什么?因为“关联数组”不是Perl 1中的第一类对象。$foo{bar}
有效,但没有%foo
。我真的不知道为什么,即使Perl 1手册也承认这是哇哇的。因此,为了与Perl 1兼容,您可以在不使用%
的情况下访问全局哈希,如果您的键盘坏了或Apple决定没有人使用%
符号。
chdir
有些奇怪之处。没有参数的chdir()
会将您带到您的主目录,复制shell cd
行为。不幸的是,chdir undef
和chdir ""
也会很难捕捉到chdir
周围的错误。幸运的是,这种行为已被弃用。我必须确保它在5.14中死掉。
$[
仍然存在,并且仍然没有被贬低,但“非常气馁”。它会改变数组的第一个索引,所以如果你是一个像我一样的人,从1开始计算你可以做到:
$[ = 1;
@foo = qw(foo bar baz);
print $foo[2]; # prints bar
Perl 5将其更改为文件范围,否则它是性能拖累和CrAzY的重要来源。
答案 4 :(得分:3)
我有一些时髦的错误,Perl4和Perl5以不同的顺序评估作业的左手和右手边,引用Perl traps for the unwary:
任何指派运算符的LHS与RHS。首先在perl4中评估LHS,在perl5中评估第二;这会影响子表达式中副作用之间的关系。
@arr = ( 'left', 'right' ); $a{shift @arr} = shift @arr; print join( ' ', keys %a ); # perl4 prints: left # perl5 prints: right
对于一些新的和可能不兼容的内容,请参阅Perl4和Perl5之间的the FAQ。