Perl版本中后向不兼容性的一些具体示例是什么?

kno*_*orv 12 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年 - 确定骆驼书中描述的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)?

请尽可能包含参考和代码示例.

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文件概述了特定版本中不兼容的更改.这些变化几乎总是模糊(如伪哈希)或小.

  • 伪哈希总是标记为实验.如果您在生产代码中使用它们,那不是我的错.:P (6认同)

Mic*_*man 11

是.有许多,虽然他们通常很小.有时这是由于弃用周期最终以删除结束.有时它是由于改变新(和实验)特征的语义.有时它会修复无法正常工作的错误.Perl开发人员尽可能地保持版本之间的向后兼容性.我记不起有一个脚本被升级到新版本的Perl而破坏了.

内部哈希顺序已多次更改.虽然这不是你应该依赖的东西,但如果你无意中这样做会导致问题.

主要(5.x)版本之间的二进制不兼容性很常见,但这通常只意味着需要重新编译任何XS扩展.

完整列表太长了,无法在此列出.您可以通过查看每个版本历史记录的"不兼容的更改"部分来获取它.


Sch*_*ern 5

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的重要来源.

  • *Hash%foo错过了参数中的%...*这是我以前从未见过的警告.我喜欢perldiag的描述:"真的很老的Perl让你在某些地方省略了哈希名称的百分比.现在已经大量弃用了." 不过,显然它并没有被大量弃用以实际删除它. (2认同)