kno*_*orv 12 perl compatibility backwards-compatibility language-history
Perl 1.0(1987年12月18日)的首次公开发布与目前的稳定版本5.10.1(2009)之间已有22年的历史.
在这22年中,发布了以下重要版本:
我正在寻找Perl历史中反向不兼容的具体示例.
题:
请尽可能包含参考和代码示例.
Sch*_*ern 14
最有意识的不兼容性之一是在Perl 4和Perl 5之间改变的数组插值.
my @example = qw(1 2 3);
print "foo@example.com";
Run Code Online (Sandbox Code Playgroud)
在Perl 4中将是:
foo@example.com
Run Code Online (Sandbox Code Playgroud)
在Perl 5中,它将是:
foo1 2 3.com
Run Code Online (Sandbox Code Playgroud)
幸运的是,如果数组不存在,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中没有变化. 拉里沃尔注意到并做了相当于OMG YER DOIN IT WONG !!! 新的Perl 6版本被认为明显更好,因此5.10.1修复了它.
Leo*_*ans 12
伪哈希是我脑海中最近的一个例子.通常,perldelta文件概述了特定版本中不兼容的更改.这些变化几乎总是模糊(如伪哈希)或小.
OTOH有一些可追溯到Perl 1的野性特征仍然可以使用.例如,这打印什么?
%foo = (foo => 23);
print values foo
Run Code Online (Sandbox Code Playgroud)
那是对的,23.为什么?因为"关联数组"不是Perl 1中的第一类对象. $foo{bar}
但是没有%foo
.我真的不知道为什么,即使Perl 1手册也承认这是哇哇的.因此,为了与Perl 1兼容,您可以在不使用a的情况下访问全局哈希%
,如果您的键盘坏了或Apple决定没人使用该%
符号.
chdir
有些奇怪. chdir()
没有参数将带您到您的主目录,复制shell cd
行为.不幸的是,chdir undef
并且chdir ""
很难捕捉周围的错误chdir
.幸运的是,这种行为已被弃用.我必须确保它在5.14中死亡.
$[
仍然存在并且仍然没有被贬低,但"非常沮丧".它改变了数组的第一个索引,所以如果你是一个像我这样的人,从1算起,你可以这样做:
$[ = 1;
@foo = qw(foo bar baz);
print $foo[2]; # prints bar
Run Code Online (Sandbox Code Playgroud)
Perl 5将其更改为文件范围,否则它是性能拖累和CrAzY的重要来源.