这是命令 perl5220delta 可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
perl5220delta - perl v5.22.0 的新功能
商品描述
本文档描述了 5.20.0 版本和 5.22.0 版本之间的差异。
如果您是从较早的版本(例如 5.18.0)升级,请先阅读 perl5200delta,
它描述了 5.18.0 和 5.20.0 之间的差异。
核心科目 增强
新建 按位 运营商
添加了一个新的实验设施,使四个标准的按位运算符
("& | ^ ~") 将它们的操作数始终视为数字,并引入了四个新的虚线
运算符 ("&. |. ^. ~.") 将其操作数始终视为字符串。 相同
适用于赋值变体 ("&= |= ^= &.= |.= ^.=")。
要使用它,请启用“按位”功能并禁用“实验::按位”警告
类别。 有关详细信息,请参阅 perlop 中的“按位字符串运算符”。 [perl #123466]
.
新建 双钻 操作者
“<<>>”类似于“<>”,但使用三个参数“open”来打开@ARGV 中的每个文件。 这意味着
@ARGV 的每个元素都将被视为一个实际的文件名,而 "|foo" 不会是
视为管道打开。
新建 “\b” 边界 in 定期 表达式
"qr/\b{gcb}/"
“gcb”代表 Grapheme Cluster Boundary。 它是一个 Unicode 属性,可以找到
在本地看起来像单个字符的字符序列之间的边界
说一种语言的人。 Perl 早就有能力通过“\X”来处理这些
常规转义序列。 现在,有一种处理这些的替代方法。 见“\b{},
\b, \B{}, \B" in perlrebackslash 了解详情。
"qr/\b{wb}/"
“wb”代表词边界。 它是一个 Unicode 属性,可以找到之间的边界
字。 这类似于普通的“\b”(没有大括号),但更适合于
自然语言处理。 例如,它知道撇号可以出现在
单词的中间。 有关详细信息,请参阅 perlrebackslash 中的“\b{}、\b、\B{}、\B”。
"qr/\b{sb}/"
“sb”代表句子边界。 它是一个 Unicode 属性,用于帮助解析自然
语言句子。 有关详细信息,请参阅 perlrebackslash 中的“\b{}、\b、\B{}、\B”。
非捕获 原价 口语 旗
正则表达式现在支持“/n”标志,该标志禁用捕获和填充 $1、$2、
组内等:
"你好" =~ /(你好|你好)/n; # $1 未设置
这相当于在每个捕获组的开头放置“?:”。
有关详细信息,请参阅 perlre 中的“n”。
“用 re '严格的'”
这将更严格的语法规则应用于在其内部编译的正则表达式模式
范围。 这有望提醒您注意错别字和其他无意的行为
向后兼容性问题阻止我们以正常的正则表达式进行报告
汇编。 因为这个行为在未来的 Perl 版本中可能会发生变化
随着我们获得经验,使用此 pragma 将引发类别警告
“实验性::re_strict”。 参见“严格”。
统一 7.0 (与 更正) is 现在 支持的
有关此版本中的内容的详细信息,请参阅
<http://www.unicode.org/versions/Unicode7.0.0/>. Unicode 7.0 版本来了
使用 Perl 包括处理阿拉伯语字形整形的更正(请参阅
<http://www.unicode.org/errata/#current_errata>)。
“用 地区” 能够 限制 这 当地 类别 旨在 影响
现在可以传递一个参数来“使用语言环境”来指定语言环境的子集
类别可识别区域设置,其余类别不受影响。 请参阅“使用区域设置”
pragma" in perllocale 了解详细信息。
Perl的 现在 支持 POSIX 2008 当地 currency 增加
在能够处理 POSIX.1-2008 的平台上,由
"POSIX::localeconv()" 包括该版本添加的国际货币字段
POSIX 标准。 它们是“int_n_cs_precedes”、“int_n_sep_by_space”、
“int_n_sign_posn”、“int_p_cs_precedes”、“int_p_sep_by_space”和“int_p_sign_posn”。
更好 启发式 on 老年人 平台 HPMC胶囊 确定 当地 UTF-8 编码
在既没有实现 C99 标准也没有实现 POSIX 2001 标准的平台上,
确定当前语言环境是否为 UTF-8 取决于试探法。 这些是
在此版本中有所改进。
混叠 通过 参考
变量和子程序现在可以通过分配给引用来别名:
\$c = \$d;
\&x = \&y;
别名也可以通过在“foreach”迭代器之前使用反斜杠来完成
多变的; 这可能是此功能提供的最有用的习惯用法:
foreach \%hash (@array_of_hash_refs) { ... }
此功能是实验性的,必须通过“使用功能‘重别名’”启用。 它会
除非禁用“experimental::refaliasing”警告类别。
请参阅 perlref 中的“分配给引用”
“原型” - 没有 参数
没有参数的“prototype()”现在推断 $_。 [perl #123514]
.
新建 “:常量” 子程序 属性
“const”属性可以应用于匿名子程序。 它导致新子
每当创建一个时立即执行(如 当“子”表达式是
评估)。 它的值被捕获并用于创建一个新的常量子程序,它是
回。 此功能是实验性的。 请参阅 perlsub 中的“常量函数”。
“文件编号” 现在 运作方式 on 目录 手柄
当操作系统提供相关支持时,现在内置的“fileno”
作用于目录句柄,以与 for 相同的方式产生底层文件描述符
文件句柄。 在没有这种支持的操作系统上,目录句柄上的“fileno”
继续返回未定义的值,就像以前一样,但也设置了 $! 表明
不支持操作。
目前,这使用操作系统“DIR”结构中的“dd_fd”成员,或 目录(3)
POSIX.1-2008 指定的功能。
列表 申请 of 管 open 实施 HPMC胶囊 Win32
管道列表形式:
打开我的 $fh, "-|", "program", @arguments;
现在在 Win32 上实现。 它与 Win32 上的“系统列表”具有相同的限制,因为
Win32 API 不接受程序参数作为列表。
转让 至 名单 重复
"(...) x ..." 现在可以在分配给的列表中使用,只要左边的
side 是一个有效的左值。 这允许写入 "(undef,undef,$foo) = that_function()"
如“((undef)x2, $foo) = that_function()”。
Infinity, 和 为NaN (非数字) 处理 改善
浮点值能够容纳特殊值无穷大、负无穷大和
NaN(非数字)。 现在我们更稳健地识别和传播价值
计算,并在输出时将它们标准化为字符串“Inf”、“-Inf”和“NaN”。
另请参阅 POSIX 增强功能。
漂浮的 点 解析 具有 很 改善
浮点值的解析和打印已得到改进。
作为一个全新的功能,十六进制浮点文字(如“0x1.23p-4”)是
现在支持,它们可以用“printf”%a“”输出。 请参阅“标量值构造函数”
在 perldata 中了解更多详细信息。
包装 无穷大 or 非数字 成 a 字符 is 现在 致命
以前,当试图将无穷大或非数字打包成(有符号的)字符时,Perl 会
警告,并假设您尝试打包 0xFF; 如果你把它作为 "chr", "U+FFFD" 的参数
被退回。
但是现在,所有此类操作(“pack”、“chr”和“print '%c'”)都会导致致命错误。
实验 C 回溯 API
Perl 现在支持(通过 C 级 API)检索 C 级回溯(类似于什么
像 gdb 这样的符号调试器)。
回溯返回 C 调用帧的堆栈跟踪,带有符号名称
(函数名称),对象名称(如“perl”),如果可以,还有源代码
位置(文件:行)。
支持的平台是 Linux 和 OS X(某些 *BSD 可能至少部分工作,但它们
尚未测试)。
该功能需要通过“Configure -Dusecbacktrace”启用。
有关更多信息,请参阅 perlhacktips 中的“C backtrace”。
安全性
Perl的 is 现在 编译 - “-fstack-protector-strong” if 可使用
Perl 已经使用反堆栈粉碎选项“-fstack-protector”编译,因为
5.10.1. 现在 Perl 使用名为“-fstack-protector-strong”的较新变体(如果可用)。
这个 安全 模块 可以 让 学校以外 包 至 be 更换
关键错误修复:可以替换外部包。 安全已被修补到 2.38
解决这个问题。
Perl的 is 现在 时刻 编译 - “-D_FORTIFY_SOURCE=2” if 可使用
gcc 4.* 中名为“_FORTIFY_SOURCE”的“代码强化”选项现在始终可用
用于编译 Perl(如果可用)。
请注意,这不一定是一个巨大的步骤,因为在许多平台中该步骤已经
几年前被采用:许多 Linux 发行版(如 Fedora)一直在使用这个
Perl 的选项,而 OS X 多年来一直在执行相同的操作。
不相容 更改
子程序 签名 移动 before 属性
5.20 中引入的实验性子签名功能在
属性。 在此版本中,根据实验功能用户的反馈,
定位已被移动,以便在子程序名称之后出现签名(如果
any) 并且在属性列表之前(如果有)。
“&” 和 “\&” 原型 接受 仅由 潜艇
"&" 原型字符现在只接受匿名订阅 ("sub {...}"),事物
以“\&”或明确的“undef”开头。 以前它错误地也允许
对数组、散列和列表的引用。 [perl #4539]
. [perl #4539]
. [perl #123062]
.
此外,“\&”原型允许子程序调用,而现在它只允许
子程序:&foo 仍然允许作为参数,而“&foo()”和“foo()”不再
是。 [perl #77860] .
“用 编码" is 现在 词法
编码编译指示的效果现在仅限于词法范围。 此 pragma 已弃用,
但与此同时,它可能会对包含在
相同的程序; 此更改解决了这个问题。
列表 片 返回 空的 名单
列表切片现在仅在原始列表为空时(或者如果有
没有索引)。 以前,如果所有索引都下降,列表切片将返回一个空列表
在原始列表之外; 现在它在这种情况下返回一个“undef”值列表。 [perl
#114498] .
"\N{}" - a 序列 of 多 剩余名额 is 现在 a 致命 错误
例如“\N{TOO MANY SPACES}”或“\N{TRAILING SPACE }”。 这已被弃用
v5.18。
“用 普及 '……'” is 现在 a 致命 错误
从“UNIVERSAL”导入函数自 v5.12 以来已被弃用,现在是致命的
错误。 仍然允许不带任何参数的“使用通用”。
In 双引号 “\CX", X 必须 现在 be a 打印 ASCII码 字符
在之前的版本中,如果不这样做会引发弃用警告。
拆分 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 令牌 “(?” 和 “(*” in 定期 表达式 is 现在 a 致命 汇编 错误。
自 v5.18 以来,这些已被弃用。
“qr/foo/x” 现在 忽略 所有 统一 模式 白色 空间
“/x”正则表达式修饰符允许模式包含空格和
注释(两者都被忽略)以提高可读性。 直到现在,并不是所有的
处理了 Unicode 为此目的指定的空白字符。 这
现在承认的其他问题是:
U+0085 下一行
U+200E 从左到右标记
U+200F 从右到左标记
U+2028 线分隔符
U+2029 段落分隔符
将这些字符与“/x”一起使用在括号字符类之外,如果不是
自 v5.18 以来,前面带有反斜杠已引发弃用警告。 现在他们将
忽略了。
评论 生产线 中 “(?[ ])" 旨在 现在 截至 仅由 by a "\n"
“(?[ ])”是一个实验性功能,在 v5.18 中引入。 它的操作就像“/x”是
始终启用。 但有一个区别:注释行(在“#”字符之后)
被任何匹配的“\R”终止,其中包括所有垂直空格,例如
表单馈送。 为了保持一致性,现在更改为匹配终止注释行的内容
在“(?[ ])”之外,即一个“\n”(即使被转义),这与终止一个
继承人字符串和格式。
“(?[...])” 运营商 现在 遵循 Perl的 优先权
此实验性功能允许在正则表达式模式中进行设置操作。 之前
这样,交集运算符与其他二元运算符具有相同的优先级。
现在它具有更高的优先级。 这可能会导致与现有代码不同的结果
期望(尽管文档一直指出这种变化可能会发生,
建议将表达式完全括起来)。 请参阅“扩展括号字符
类”在 perlrecharclass 中。
省略 “%” 和 “ @” on 哈希 和 排列 名称 is 没有 不再 允许
真的很老的 Perl 允许你省略数组名称上的“@”和一些散列名称上的“%”
斑点。 这已发出自 Perl 5.000 以来的弃用警告,并且不再是
允许的。
“$!” 文本 is 现在 in 英语 学校以外 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 范围 of “用 地区”
以前,文本与几乎所有其他内容不同,总是基于当前
程序的底层语言环境。 (在某些系统上也受影响的是“$^E”。)对于程序
没有准备好处理区域设置差异,这可能会导致垃圾文本
显示。 最好显示可通过某些工具翻译的文本而不是垃圾文本
更难弄清楚的文本。
“$!” 文本 将 be 回 in UTF-8 ,尤其是 适当
$! 的字符串化并且 $^E 将设置 UTF-8 标志,当文本实际上是
非 ASCII UTF-8。 这将使设置为区域设置感知的程序能够正确地
以用户的母语输出消息。 需要继续 5.20 和
较早的行为可以在“使用字节”和“使用字节”的范围内进行字符串化
"使用语言环境":messages""。 在这两个范围内,不会有其他 Perl 操作
受地域影响; 只有$! 和 $^E 字符串化。 “字节”编译指示导致 UTF-8
不设置标志,就像在以前的 Perl 版本中一样。 这解决了 [perl #112208]
.
支持 HPMC胶囊 “?图案?” 也完全不需要 明确的 操作者 具有 很 去除
“m?模式?” 构造,它只允许匹配一个正则表达式一次,以前有一个
直接用问号分隔符书写的替代形式,省略
显式“m”运算符。 自 5.14.0 以来,这种用法产生了弃用警告。 它是
现在出现语法错误,因此问号可用于新运算符。
“定义(@array)” 和 “已定义(%hash)” 旨在 现在 致命 错误
这些自 v5.6.1 以来已被弃用,并自 v5.16 以来引发了弃用警告。
运用 a 哈希 or an 排列 as a 参考 旨在 现在 致命 错误
例如,"%foo->{"bar"}" 现在会导致致命的编译错误。 这些已经
自 v5.8 之前弃用,并从那时起提出弃用警告。
更改 至 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 “*” 原型
子程序原型中的“*”字符用于允许裸词优先
大多数(但不是全部)子程序名称。 它从来都不是一致的并且表现出错误
行为。
现在已经改了,所以子程序总是优先于裸词,这
使其符合类似的原型内置函数:
子 splat(*) { ... }
子 foo { ... }
啪(富); # 现在总是 splat(foo())
啪(条); # 仍然像以前一样 splat('bar')
关闭(富); # 关闭(foo())
关闭(酒吧); # 关闭('bar')
弃用
设置 “${^编码}” 至 什么 但是 “未定义”
此变量允许以 ASCII 或 UTF-8 以外的编码编写 Perl 脚本。
但是,它会影响全局的所有模块,导致错误的答案和分段
故障。 新脚本应使用 UTF-8 编写; 旧脚本应转换为 UTF-8,
这可以通过 piconv 实用程序轻松完成。
使用 VHDL 语言编写 of 非图形 字符 in 单字符 变量 名称
单字符变量名的语法比更长的变量更宽松
名称,允许单字符名称为标点字符甚至不可见(a
非图形)。 Perl v5.20 弃用了 ASCII 范围控件作为这样的名称。 现在,所有
不推荐使用以前允许的非图形字符。 实际效果
这仅在不在“使用 utf8”下时才会发生,并且仅影响 C1 控件(代码点
0x80 到 0xFF)、无间断空间和软连字符。
内联 of “子 () { $变量 }" - 可观察的 副作用
在许多情况下,Perl 将 "sub() { $var }" 变成一个可内联的常量子程序,
在评估“sub”表达式时捕获 $var 的值。 这可以打破
在 $var 随后被修改的情况下的关闭行为,因为
子程序不会返回更改后的值。 (请注意,这一切仅适用于匿名
具有空原型的子程序(“sub ()”)。)
在可以修改变量的情况下,现在不推荐使用此用法
别处。 Perl 检测到这些情况并发出弃用警告。 这样的代码将
未来可能会发生变化并停止产生常数。
如果你的变量只在它声明的地方被修改,那么 Perl 会
继续使 sub inlineable 没有警告。
子 make_constant {
我的 $var = shift;
返回子 () { $var }; # 美好的
}
子 make_constant_deprecated {
我的 $var;
$var = 移位;
返回子 () { $var }; # 已弃用
}
子 make_constant_deprecated2 {
我的 $var = shift;
log_that_value($var); # 可以修改 $var
返回子 () { $var }; # 已弃用
}
在上面的第二个例子中,检测 $var 只分配给一次太难了
探测。 它发生在“我的”声明以外的地方就足以让 Perl
觉得可疑。
此弃用警告仅发生在 sub 主体的简单变量中。 (一个
sub 中的“BEGIN”块或“use”语句被忽略,因为它不会变成
sub 身体的一部分。)对于更复杂的情况,例如
“sub () { do_something() if 0; $var }” 行为已经改变,使得内联
如果该变量可在其他地方修改,则不会发生。 这种情况应该很少见。
使用 VHDL 语言编写 of 多 “/X” 正则表达式 修饰符
现在不推荐使用以下任何内容:
qr/foo/xx;
/(?xax:foo)/;
使用 re qw(/amxx);
也就是说,现在“x”应该只在任何连续正则表达式字符串中出现一次
模式修饰符。 我们不相信在所有 CPAN 中都发生过这种情况。
这是为将来的 Perl 版本做准备,该版本具有“/xx”允许空白
括号中的字符类(括在方括号中的字符类:“[...]”)的可读性。
运用 a 没有休息 空间 in a 字符 别号 HPMC胶囊 "\N{...}" is 现在 弃用
这种非图形字符基本上与常规空间无法区分,因此
不应该被允许。 请参阅字符名中的“自定义别名”。
A 文字 “{” 应该 现在 be 逃脱了 in a 模式
如果您想在常规中使用文字左大括号(也称为左大括号)
表达式模式,您现在应该通过在它前面加上反斜杠来转义它
("\{") 或将其括在方括号 "[{]" 中,或使用 "\Q"; 否则
将引发弃用警告。 这首先在 v5.16 中宣布即将推出
发布; 它将允许对语言的未来扩展。
制作 所有 警告 致命 is 泄气
致命警告的文档指出“使用警告 FATAL => 'all'”是
不鼓励,并提供了关于致命警告风险的更强有力的语言。
性能 增强
· 如果在编译时已知方法或类名,则预先计算散列以加快速度
运行时方法查找。 此外,像“SUPER::new”这样的复合方法名被解析在
编译时,以节省必须在运行时解析它们。
· 仅使用常量或简单的数组和哈希查找(尤其是嵌套查找)
变量作为键,现在要快得多。 查看“内部变化”了解更多
细节。
· "(...)x1"、"("constant")x0" 和 "($scalar)x0" 现在在列表上下文中进行了优化。 如果
右边的参数是一个常数 1,重复运算符消失了。 如果
右手边的参数是一个常数 0,整个表达式被优化为空
列表,只要左边的参数是一个简单的标量或常数。 (那是,
"(foo())x0" 不受此优化的影响。)
· "substr" 赋值现在优化为 4 个参数的 "substr"
子程序(或作为“返回”的参数)。 以前,此优化仅
发生在空上下文中。
· 在 "\L..."、"\Q..." 等中,额外的 "stringify" 操作现在被优化掉,使得
这些和“lcfirst”、“quotemeta”等一样快。
· 分配给空列表现在有时会更快。 特别是,它从不调用
右侧的绑定参数上的“FETCH”,而它曾经有时如此。
· 当“长度”应用于非
神奇的、非绑定的字符串,并且“使用字节”在范围内或字符串不使用
UTF-8 内部。
· 在大多数使用 64 位整数的 perl 构建中,非魔法、非绑定的内存使用
仅包含浮点值的标量减少了 8 到 32
字节,取决于操作系统。
· 在“@array = split”中,赋值可以优化掉,这样“split”写
直接到数组。 这种优化只发生在其他包阵列上
比@_,而且只是有时。 现在这种优化几乎一直在发生。
· “加入”现在受到不断折叠的影响。 因此,例如“加入“-”、“a”、“b””是
在编译时转换为“ab”。 此外,“加入”一个标量或常数
要加入的分隔符和单项列表被简化为字符串化,并且
分隔符甚至没有得到评估。
· "qq(@array)" 使用两个操作实现:一个字符串化操作和一个连接操作。 如果“QQ”
只包含一个数组,字符串化被优化掉了。
· 在运行时不再计算 void 上下文中的“our $var”和“our($s,@a,%h)”。
甚至整个序列的“我们的 $foo;” 语句将被简单地跳过。 相同
适用于“状态”变量。
· 重构了许多内部函数以提高性能并减少它们
内存足迹。 [perl #121436]
[perl #121906] [perl #121906]
· 当检测到空文件时,“-T”和“-B”文件测试将更快返回。 [perl
#121489]
· 键为常量的哈希查找更快。
· 具有空原型和仅包含“undef”的主体的子程序现在
符合内联条件。 [perl #122728]
· 包中的子程序不再需要存储在 typeglobs 中:声明一个
如果可能,子程序现在将直接在存储中放置一个简单的子引用,
节省内存。 typeglob 理论上仍然存在,因此访问它会导致
要升级到 typeglob 的存储条目(如 这只是一个内部实现
细节)。 此优化目前不适用于 XSUB 或导出的子程序,
并且方法调用将撤消它,因为它们将内容缓存在 typeglobs 中。 [perl #120441]
· 函数“utf8::native_to_unicode()”和“utf8::unicode_to_native()”(见utf8)
现在在 ASCII 平台上进行了优化。 现在甚至没有最低性能
在 ASCII 和 EBCDIC 平台之间编写可移植的代码。
· 对于每个 perl 进程,Win32 Perl 使用的每个进程内存比以前少 8 KB,
因为一些数据现在从磁盘映射到内存并在进程之间共享
相同的 perl 二进制文件。
科目 和 实用语
更新 科目 和 实用语
从 v5.20.0 开始,许多随 perl 分发的库已经升级。 为一个
完整的更改列表,运行:
核心列表 --diff 5.20.0 5.22.0
您也可以用自己喜欢的版本代替 5.20.0。
一些显着的变化包括:
· Archive::Tar 已升级至 2.04 版。
现在可以并行运行测试。
· 属性已升级到0.27版本。
XS 中“memEQs”的使用已得到纠正。 [perl #122701]
避免读取超出缓冲区的末尾。 [perl #122629]
· B已升级至1.58版本。
它提供了一个新的“B::safename”函数,基于现有的“B::GV->SAFENAME”,
将“\cOPEN”转换为“^OPEN”。
空的 COP 现在属于“B::COP”类,而不是“B::OP”。
"B::REGEXP" 对象现在提供了一个 "qr_anoncv" 方法来访问隐式 CV
与包含代码块的“qr//”事物以及一个“compflags”方法相关联
返回源自“qr//blahblah”操作的相关标志。
“B::PMOP”现在提供一个“pmregexp”方法返回一个“B::REGEXP”对象。 两款新品
类,“B::PADNAME”和“B::PADNAMELIST”,已经被引入。
一个错误,在 ithread 创建或伪分叉之后,特殊/不朽的 SV 在
子 ithread/psuedoprocess 没有正确的“B::SPECIAL”类,已被
固定的。 添加了“id”和“outid”PADLIST 方法。
· B::Concise 已升级到 0.996 版本。
作为执行链一部分的空操作现在被赋予序列号。
空操作的私有标志现在与助记符一起转储,因为它们将用于
非空的对应物。
· B::Deparse 已升级到1.35 版。
它现在在语句的开头正确解析 "+sub : attr { ... }"。 没有
最初的“+”、“sub”将是一个语句标签。
“BEGIN”块现在大部分时间都在正确的位置发出,但是变化
不幸的是引入了一个回归,因为“BEGIN”块发生在之前
封闭块的结尾可能会出现在它的下方。
“B::Deparse”不再在这里和那里放置错误的“本地”,例如“LIST =
tr/a//d”。[perl #119815]
如果包含“do”,则相邻的“use”语句不再意外嵌套
堵塞。 [perl #115066]
传递给“\”的列表中带括号的数组现在正确解析为
括弧 (例如, "\(@a, (@b), @c)" 现在保留了@b) 周围的括号,因此
保留引用括号数组的展平行为。 以前,它
仅适用于一个数组:“\(@a)”。
“本地我们的”现在被正确解析,包括“我们的”。
"for($foo; !$bar; $baz) {...}" 在没有 "!" 的情况下被解析(或不”)。 这已经
固定的。
与词法子程序冲突的核心关键字现在用
“核心::”前缀。
“foreach state $x (...) {...}”现在用“state”而不是“my”正确解析。
“我们的@array = split(...)”现在在这些情况下正确地解析为“我们的”
分配被优化掉了。
它现在解析“我们的(列表)” 并正确输入词法(“my Dog $spot”)。
将 $#_ 解析为那个而不是 $#{_}。 [perl #123947]
封闭范围末尾的 BEGIN 块现在在正确的位置进行了解析。
[perl #77452]
BEGIN 块有时被解析为 __ANON__,但现在总是称为 BEGIN。
词法子程序现在完全解析。 [perl #116553]
"Anything =~ y///r" 与 "/r" 不再省略左侧操作数。
组成正则表达式代码块的操作树现在被真正解析了。 以前,该
使用了构成正则表达式的原始字符串。 这引起了问题
用“qr/(?{<
[perl #123217] [perl #115256]
$; 在语句的末尾不再丢失分号。 [perl #123357]
一些以速记形式存储在 stash 中的子程序声明的情况正在
省略。
非 ASCII 字符现在始终在字符串中转义,而不是某些
时间。 (正则表达式和标识符仍然存在突出问题
尚未修复。)
当原型子调用被“&”解析时(例如,在 -P 选项),“标量”
现在在适当的地方添加,以强制原型隐含的标量上下文。
“require(foo())”、“do(foo())”、“goto(foo())”和类似的带有循环控制的结构
现在已正确解析。 外括号不是可选的。
正则表达式中不再转义空格,因为它正在
在“(?x:...)”部分中错误地转义。
“sub foo { foo() }”现在用那些强制括号进行解析。
“/@array/”现在被解析为正则表达式,而不仅仅是@array。
"/@{-}/", "/@{+}/" 和 $#{1} 现在用大括号解析,在
这些情况。
在解析功能包时,“B::Deparse”发出“无功能;” 首先代替
“没有功能 ':all';”。 这已被修复。
“chdir FH”现在没有引号。
"\my @a" 现在没有括号被解析。 (括号会使数组变平。)
“system”和“exec”后跟一个块现在可以正确解析。 以前有
在块之前是一个错误的“做”。
"use constant QR => qr/.../flags" 后跟 """ =~ QR" 不再没有
标志。
解析“BEGIN { undef &foo }” -w 启用开关开始发射
Perl 5.14 中的“未初始化”警告。 这已被修复。
使用“(;+)”原型解析对 subs 的调用会导致无限循环。 这
"(;$") "(_)" 和 "(;_)" 原型被赋予错误的优先级,导致
"foo($a<$b)" 要在没有括号的情况下进行解析。
Deparse 现在在内部 subs 中提供了一个定义的 state sub。
· B::Op_private 已添加。
B::Op_private 提供有关“op_private”中使用的标志的详细信息
perl 操作码字段。
· bigint、bignum、bigrat 已升级到0.39 版本。
CAVEATS 中的文档指出,使用字符串作为数字并不总是会调用大数字
重载,以及如何调用它。 [rt.perl.org #123064]
· 鲤鱼升级到1.36版本。
如果 Carp 比 1.12 新,“Carp::Heavy”现在会忽略与 Carp 的版本不匹配,
因为“Carp::Heavy”的内脏在那时被合并到了鲤鱼中。 [perl #121574]
Carp 现在可以更好地处理非 ASCII 平台。
Perl < 5.14 的逐一错误修复。
·常量已经升级到1.33版本。
它现在接受完全限定的常量名称,允许在
调用者以外的包。
· CPAN 已升级至 2.11 版。
添加对“Cwd::getdcwd()”的支持并引入针对在
草莓 Perl 5.20.1。
在构建依赖项错误后修复“chdir()”。
引入对插件/钩子的实验支持。
集成“App::Cpan”源。
不要检查可选依赖项的递归。
完整性检查 元文件 包含一个哈希值。 [cpan #95271]
· CPAN::Meta::Requirements 已升级到 2.132 版。
解决“version::vpp”检测v-string魔法的限制并增加支持
对于即将推出的 ExtUtils::MakeMaker 引导程序 版本.pm 对于 5.10.0 以上的 Perls。
· Data::Dumper 已升级到 2.158 版本。
通过添加配置变量/选项来限制递归,修复 CVE-2014-4330
转储深层数据结构。
更改以解决 Coverity 问题。 XS 转储错误地存储了代码名称
存储在 GLOB 中的引用。 [perl #122070]
· DynaLoader 已升级至 1.32 版。
如果在 Dynaloader 中未使用,请删除“dl_nonlazy”全局。 [perl #122926]
· Encode 已升级至 2.72 版。
当编码名称不存在时,“piconv”现在有更好的错误处理,并且
在 perl-5.8.2 及更早版本中升级 Encode 时构建损坏已得到修复。
在 Windows 上以 C++ 模式构建现在可以工作。
· Errno 已升级到 1.23 版本。
在 GCC 5 的预处理器命令行中添加“-P”。GCC 添加了额外的行指令,
破坏错误代码定义的解析。 [rt.perl.org #123784]
· 实验已经升级到0.013版本。
5.15.7 之前的 Perls 的硬编码功能。
· ExtUtils::CBuilder 已升级到 0.280221 版本。
修复了 Android 上的回归。 [perl #122675]
· ExtUtils::Manifest 已升级到 1.70 版。
修复了“maniread()”处理引用文件名的错误并改进了“manifind()”
跟随符号链接。 [perl #122415]
· ExtUtils::ParseXS 已升级到 3.28 版。
只有在我们实际定义它时才声明未使用的“文件”。 改进生成的“RETVAL”代码
避免重复引用 ST(0). [perl #123278] 扩大和记录
"/OBJ$/" 到 "/REF$/" 类型映射优化 "DESTROY" 方法。 [perl
第123418话
· Fcntl 已升级到 1.13 版。
添加对 Linux 管道缓冲区大小“fcntl()”命令的支持。
· File::Find 已升级到 1.29 版。
“find()”和“finddepth()”现在会在不恰当或拼写错误时发出警告
选项。
· File::Glob 已升级到 1.24 版。
避免“SvIV()”扩展到在一些地方调用“get_sv()”三次。 [perl
第123606话
· HTTP::Tiny 已升级到 0.054 版本。
“keep_alive”现在是分叉安全和线程安全的。
· IO已升级到1.35版本。
为了旧的 Perls,XS 实现已被修复。
· IO::Socket 已升级至 1.38 版。
记录“connected()”方法的局限性。 [perl #123096]
· IO::Socket::IP 已升级到0.37 版本。
更好地修复子类化“connect()”。 [cpan #95983]
[cpan #95983]
为“connect()”实现超时。 [cpan #92075]
· libnet 模块集合已升级到版本 3.05。
支持 IPv6 和 SSL 到“Net::FTP”、“Net::NNTP”、“Net::POP3”和“Net::SMTP”。
“Net::SMTP”身份验证的改进。
· Locale::Codes 已升级到 3.34 版。
修复了用于从电子表格中提取数据的脚本中的一个错误,该错误阻止了
SHP 货币代码被发现。 [cpan #94229]
添加了新代码。
· Math::BigInt 已升级到 1.9997 版本。
从 CPAN 版本同步 POD 更改。 "Math::BigFloat->blog(x)" 会
当准确度大于 2 位时,有时会返回“blog(70*x)”。 结果
列表上下文中的“Math::BigFloat->bdiv()”现在满足“x = quotient * divisor +
余”。
正确处理子类。 [cpan #96254]
[cpan #96254]
· Module::Metadata 已升级至 1.000026 版本。
使用 6.63_03 之前的 ExtUtils::MakeMaker 支持在旧 perls 上的安装
· 重载已升级到1.26版本。
删除了多余的“ref $sub”检查。
· PathTools 模块集合已升级到版本 3.56。
来自欧盟的警告 GCC 现在在构建 XS 时避免编译器。
不要在 Cygwin 上将前导“//”变成“/”。 [perl #122635]
· perl5db.pl 已升级到 1.49 版。
调试器会导致断言失败。 [perl #124127]
“tmux”下调试器中的“fork()”现在将为分叉创建一个新窗口
过程。 [perl #121333]
调试器现在在启动时保存当前工作目录并在启动时恢复它
你用“R”或“重新运行”重新启动你的程序。 [perl #121509]
· PerlIO::scalar 已升级到 0.22 版本。
从远远超过标量结尾的位置读取现在可以正确返回结尾
文件。 [perl #123443]
寻找负位置仍然失败,但不再离开文件位置集
到否定位置。
“PerlIO::scalar”句柄上的“eof()”现在在文件位置正确时正确返回真
在 2 位系统上超过了 32GB 标记。
尝试在平台不可能的文件位置写入现在提前失败
而不是包装在 4GB。
· Pod::Perldoc 已升级到 3.25 版。
打开用于读取或写入的文件句柄现在设置了 ":encoding(UTF-8)"。 [cpan
#98019]
· POSIX 已升级到 1.53 版。
C99 数学函数和常数(例如“acosh”、“isinf”、“isnan”、“round”、
“截断”; 已添加“M_E”、“M_SQRT2”、“M_PI”)。
“POSIX::tmpnam()”现在会产生弃用警告。 [perl #122005]
· Safe 已升级至 2.39 版。
“reval”没有正确传播无效上下文。
· Scalar-List-Utils 已升级到 1.41 版。
添加了一个新模块 Sub::Util,包含与 CODE refs 相关的功能,
包括“subname”(受“Sub::Identity”启发)和“set_subname”(复制和
从“Sub::Name”重命名)。 “List::Util::reduce()”中“GetMagic”的使用也有
已修复。 [cpan #63211]
· SDBM_File 已升级至 1.13 版。
简化了构建过程。 [perl #123413]
· Time::Piece 已升级至 1.29 版。
当漂亮地打印负“Time::Seconds”时,“减号”不再丢失。
· Unicode::Collate 已升级到 1.12 版。
0.67 版改进的不连续收缩在默认情况下无效并且是
支持作为参数“long_contraction”。
· Unicode::Normalize 已升级到 1.18 版。
XSUB 实现已被删除以支持纯 Perl。
· Unicode::UCD 已升级至 0.61 版。
新功能 属性值() 已添加以返回给定属性的可能
值。
新功能 属性() 已添加以返回给定属性的值
给定的代码点。
新功能 charprops_all() 已添加以返回所有 Unicode 的值
给定代码点的属性。
一个错误已被修复,以便 传播() 返回正确的短名称和长名称
对于不正确的 Perl 扩展。
一个错误已被修复,以便 prop_value_aliases() 返回“undef”而不是错误
Perl 扩展属性的结果。
该模块现在适用于 EBCDIC 平台。
· utf8 已经升级到 1.17 版本
文档和“utf8::downgrade()”中的代码不匹配已在
支持文档。 可选的第二个参数现在被正确地视为
perl 布尔值(真/假语义)而不是整数。
·版本已升级至0.9909版本。
许多变化。 见 更改 有关详细信息,请参阅 CPAN 发行版中的文件。
· Win32 已升级至 0.51 版。
“GetOSName()”现在支持 Windows 8.1,并且现在可以在 C++ 模式下进行构建。
· Win32API::File已升级至0.1202版本
以 C++ 模式构建现在可以工作。
· XSLoader 已升级至 0.20 版本。
允许 XSLoader 从不同的命名空间加载模块。 [perl #122455]
去除 科目 和 实用语
以下模块(和相关模块)已从核心 perl 中删除
分配:
· 电脑动画
· 模块::构建
文件记录
新建 文件记录
佩鲁尼库克
这份由 Tom Christiansen 撰写的文档提供了在 Perl 中处理 Unicode 的示例。
更改 至 现有 文件记录
珍珠
· 添加了关于长双打的注释。
佩拉皮
· 请注意,“SvSetSV”不会设置魔法。
· "sv_usepvn_flags" - 修复文档以提及使用 "Newx" 而不是
“malloc”。
[perl #121869]
· 阐明“NUL”可以嵌入或需要终止字符串的位置。
· 以前因格式错误而丢失的一些文档现在
包括在内。
· 条目现在被组织成组,而不是按它们所在的文件。
· 条目的字母排序现在是一致的(由 POD 自动完成)
生成器),以便在扫描时更容易找到条目。
数据
· 更新了单字符变量名的语法等等
充分解释。
· 描述了十六进制浮点数,无穷大和 NaN。
珠光体
· 本文档已根据最近的改进进行了重大更新
EBCDIC 支持。
过滤器
· 添加了限制部分。
函数
· 提及“study()”目前是一个空操作。
· 对数组值调用“删除”或“存在”现在被描述为“强
不鼓励”而不是“不赞成”。
· 改进“我们的”文档。
· "-l" 现在指出,如果文件不支持符号链接,它将返回 false
系统。 [perl #121523]
· 请注意,“exec LIST”和“system LIST”可能会回退到 Win32 上的 shell。 只有
间接对象语法“exec PROGRAM LIST”和“system PROGRAM LIST”将可靠地
避免使用外壳。
这在 perlport 中也有说明。
[perl #122046]
口吃
· OOK 示例已更新以说明 COW 更改和
偏移量的存储。
· 添加了有关 C 级符号和 libperl.t 的详细信息。
· 添加了关于 Unicode 处理的信息
· 添加了有关 EBCDIC 处理的信息
破绽
· 添加了关于在具有非 ASCII 字符集的平台上运行的注释
· 增加了关于性能测试的注释
小贴士
· 已添加文档说明假设不存在的危险
更改为 Perl 的返回值指向的静态内存的内容
C 库函数的包装器。
· 现在推荐替换“tmpfile”、“atoi”、“strtol”和“strtoul”。
· 更新了“test.valgrind”“make”目标的文档。 [perl #121431]
· 提供了关于将测试文件移植到非 ASCII 平台的信息。
· 添加了关于如何获取 C 语言堆栈回溯的注释。
珀尔赫普克斯
· 注意消息“Redeclaration of "sendpath" with a different storage class
说明符”是无害的。
本地化
· 更新了 v5.22 中的增强功能以及一些说明。
样式
· 我们现在指向 PrePAN 而不是指向模块列表
<http://prepan.org/>.
危险
· 更新了 v5.22 中的增强功能以及一些说明。
perlpodspec
· pod 语言的规范正在改变,因此 pod 的默认编码
不在 UTF-8 中(除非另有说明)是 CP1252 而不是 ISO 8859-1
(拉丁语 1)。
违反政策
· 我们现在有一个行为准则 p5p 邮件列表,如“标准
行为”在perlpolicy。
· 现在设置了将实验功能标记为非实验性的条件
出。
· 明确了在维护中允许哪些类型的更改
版本。
端口
· 已修复和/或简化过时的 VMS 特定信息。
· 添加了关于 EBCDIC 的注释。
珍珠
· 澄清了“/x”修饰符的说明,注意注释不能
通过转义它们继续到下一行; 现在有一个所有的列表
被此修饰符视为空白的字符。
· 描述了新的“/n”修饰符。
· 添加了关于如何使带括号的字符类范围可移植到非
ASCII 机器。
反斜杠
· 添加了“\b{sb}”、“\b{wb}”、“\b{gcb}”和“\b{g}”的文档。
perlrechar类
· 已在 perlrecharclass 中的“字符范围”中添加了说明以达到效果
"[AZ]"、"[az]"、"[0-9]" 及其在正则表达式中的任何子范围括起来
字符类保证与天真的说英语的人完全匹配
期望它们匹配,即使在 perl 必须做额外工作的平台(例如 EBCDIC)上
努力实现这一目标。
· Bracketed Character Classes 的文档已扩展到涵盖
“qr/[\N{named sequence}]/”中的改进(参见“Selected Bug Fixes”)。
引用
· 一个新的部分已被添加分配给参考
每秒
· 添加了关于算法复杂性和绑定散列的评论。
珀尔森
· 更正了“...”语句文档中的歧义。 [perl
#122661]
· "for" 和 "while" 中的空条件现在记录在 perlsyn 中。
代码
· 这已经进行了广泛的修订,以使其与当前的 Unicode 支持保持同步
并使其更具可读性。 值得注意的是 Unicode 7.0 改变了它应该做的事情
与非字符。 Perl 由于落后的原因保留了旧的处理方式
兼容性。 请参阅 perlunicode 中的“非字符代码点”。
简介
· 关于如何确保你的字符串和正则表达式模式的建议
解释为 Unicode 已更新。
帕尔瓦
· $] 不再列为已弃用。 相反,增加了关于
使用它与 $^V 的优缺点。 重新添加了 $OLD_PERL_VERSION
到文档作为 $] 的长格式。
· "${^ENCODING}" 现在被标记为已弃用。
· "%^H" 的条目已被澄清,表明它只能处理简单的值。
权限
· 已删除过时和/或不正确的材料。
· 更新了 VMS 中环境和外壳交互的文档。
Perlxs
· 添加了对 XS 代码中语言环境问题的讨论。
诊断
对诊断输出进行了以下添加或更改,包括警告
和致命的错误信息。 有关诊断消息的完整列表,请参阅 perldiag。
新建 诊断
新建 故障
· 标量的坏符号
(P) 一个内部请求,要求为不是符号的东西添加一个标量条目
表项。
· 不能使用哈希作为参考
(F) 您尝试使用哈希作为参考,如 "%foo->{"bar"}" 或
"%$ref->{"hello"}"。 perl <= 5.6.1 的版本曾经允许这种语法,但是
不应该。
· 不能使用数组作为引用
(F) 您尝试使用数组作为引用,如“@foo->[23]”或“@$ref->[99]”。
perl <= 5.6.1 的版本曾经允许这种语法,但不应该有。
· 不能使用 'defined(@array)'(也许你应该省略 定义()?)
(F) "defined()" 对数组没有用,因为它检查未定义的 纯量
价值。 如果您想查看数组是否为空,只需使用
“if (@array) { # not empty }” 例如。
· 不能使用 'defined(%hash)'(也许你应该省略 定义()?)
(F) "defined()" 通常不适用于哈希。
尽管“已定义的 %hash”在尚未使用的普通散列上是假的,但在
几种不明显的情况,包括迭代器、弱引用、存储名称、
甚至在“undef %hash”之后仍然为真。 这些东西使“定义的 %hash”公平
在实践中没用,所以它现在会产生一个致命的错误。
如果检查非空是您想要的,那么只需将它放在布尔上下文中(请参阅
perldata 中的“标量值”):
如果(%哈希){
# 不是空的
}
如果你有“defined %Foo::Bar::QUUX”来检查这样的包变量是否存在
那么这从来都不是真正可靠的,也不是询问
包的特性,或者它是否被加载等。
· 无法 chr %f
(F) 您将一个无效数字(如无穷大或非数字)传递给“chr”。
· 无法压缩包中的 %f
(F) 您尝试将无穷大或非数字转换为无符号字符,
没有意义。
· 不能用 '%c' 打包 %f
(F) 您尝试将无穷大或非数字转换为字符,结果没有
感。
· 无法用 '%c' 打印 %f
(F) 您尝试将无穷大或非数字打印为字符 (%c),这使得没有
感觉。 也许你的意思是“%s”,或者只是将它字符串化?
· charnames 别名定义不能包含多个空格的序列
(F) 您定义了一个字符名称,该字符名称在一行中有多个空格字符。 改变
它们到单个空格。 通常这些名称在 ":alias" 导入中定义
“使用字符名”的参数,但它们可以由安装到的翻译器定义
$^H{字符名称}。 请参阅字符名中的“自定义别名”。
· charnames 别名定义不能包含尾随空格
(F) 您定义了一个以空格字符结尾的字符名称。 除掉
尾随空格。 通常这些名称定义在 ":alias" 导入参数中
“使用字符名”,但它们可以由安装到的翻译器定义
$^H{字符名称}。 请参阅字符名中的“自定义别名”。
· :const 不允许用于命名子例程
(F) “const”属性导致匿名子程序运行及其值
在克隆时捕获。 命名子程序不会像这样克隆,
所以这个属性对他们没有意义。
· 十六进制浮点数:内部错误
(F) 在十六进制浮点处理中出现了非常糟糕的情况。
· 十六进制浮点数:不支持的 long double 格式
(F) 您已将 Perl 配置为使用 long double,但 long double 的内部结构
格式未知,因此不可能输出十六进制浮点数。
·非法suidscript
(F) 在 suidperl 下运行的脚本在某种程度上是非法的。
· 在 '(?...)' 中,'(' 和 '?' 在正则表达式中必须相邻;在 m/%s/ 中用 <-- HERE 标记
(F) 正则表达式模式中此上下文中的两个字符序列“(?”
应该是一个不可分割的标记,“(”和“?”之间没有任何内容,
但你把它们分开了。
· 在 '(*VERB...)' 中,'(' 和 '*' 必须在正则表达式中相邻;用 <-- HERE 在
多发性硬化症/
(F) 正则表达式模式中此上下文中的两个字符序列“(*”
应该是一个不可分割的标记,“(”和“*”之间没有任何内容,
但你把它们分开了。
· 正则表达式中 {,} 中的量词无效; 由 <-- HERE 标记,单位为 m/%s/
(F) 该模式看起来像一个 {min,max} 量词,但不能是 min 或 max
解析为有效数字:要么有前导零,要么代表太大
数来应对。 <-- HERE 显示正则表达式中的问题
被发现。 见 perlre。
·“%s”是正则表达式中的未知绑定类型
(F) 您使用了 "\b{...}" 或 "\B{...}" 并且 Perl 不知道 "..."。 目前
有效的在 perlrebackslash 中的 "\b{}, \b, \B{}, \B" 中给出。
· 缺少或未定义的参数要求
(F) 您试图不带参数或使用未定义的值调用“require”作为
争论。 “require”需要包名或文件规范作为
争论。 请参阅 perlfunc 中的“要求”。
以前,没有参数的“require”或“undef”警告空文件名。
新建 </p>
· \C 在正则表达式中被弃用
(D deprecated) "/\C/" 字符类在 v5.20 中被弃用,现在发出一个
警告。 打算在 v5.24 中变成错误。 这个字符类
匹配单个字节,即使它出现在多字节字符中,也会中断
封装,并且可以破坏 UTF-8 字符串。
· "%s" 在正则表达式中更清楚地写成 "%s"; 由 <-- HERE 标记,单位为 m/%s/
(W regexp)(仅在“use re 'strict'”下或在“(?[...])”内)
您指定了一个字符,该字符具有给定的更简单的书写方式,并且是
也可移植到使用不同字符集运行的平台。
· 参数 "%s" 在增量 (++) 中被视为 0
(W 数字) 指示的字符串作为参数提供给“++”运算符,该运算符
期望匹配“/^[a-zA-Z]*[0-9]*\z/”的数字或字符串。 见“自动-
增量和自动减量”在 perlop 了解详细信息。
· 正则表达式中的两个或两个范围结束都应该是Unicode; 由 <-- HERE 标记,单位为 m/%s/
(W regexp)(仅在“use re 'strict'”下或在“(?[...])”内)
在正则表达式模式中的括号字符类中,您有一个范围
使用“\N{}”指定它的一端,使用“\N{}”指定另一端
一种不可移植的机制。 Perl 将范围视为 Unicode 范围,即所有的
其中的字符被认为是 Unicode 字符,并且可能是
Perl 在某些平台上运行的不同代码点。 例如,“[\N{U+06}-\x08]”
被视为好像你说的是“[\N{U+06}-\N{U+08}]”,也就是说它匹配
Unicode 码位为 6、7 和 8 的字符。但是“\x08”可能
表明您的意思有所不同,因此会引发警告。
· 不能在非 UTF-8 语言环境中执行 %s("%s"); 解析为“%s”。
(W 语言环境) 您是 1) 在“使用语言环境”下运行; 2) 当前语言环境不是
UTF-8 一个; 3) 您试图对指定的情况进行指定的大小写更改操作
Unicode 字符; 和 4) 此操作的结果将混合 Unicode 和语言环境
规则,可能会发生冲突。
警告类别“语言环境”是新的。
· :const 是实验性的
(S Experiment::const_attr) “const”属性是实验性的。 如果你想
使用该功能,使用“无警告‘experimental::const_attr’”禁用警告,
但要知道,这样做你会冒着将来可能会破坏你的代码的风险
Perl 版本。
· gmtime(%f) 失败
(W 溢出)你用一个它无法处理的数字调用了“gmtime”:太大,
太小,或 NaN。 返回值为“undef”。
· 十六进制浮点数:指数溢出
(W 溢出) 十六进制浮点数的指数大于浮点数
点支撑。
· 十六进制浮点数:指数下溢
(W 溢出) 十六进制浮点数的指数小于浮点数
点支撑。
· 十六进制浮点数:尾数溢出
(W 溢出)十六进制浮点文字在尾数中有更多位(
“0x”和指数之间的部分,也称为分数或有效数)
比浮点支持。
· 十六进制浮点数:精度损失
(W 溢出) 十六进制浮点数内部的位数超出了
输出。 这可能是由不受支持的长双精度格式或 64 位整数引起的
不可用(需要在某些配置下检索数字)。
· 区域设置“%s”可能无法正常工作。%s
(W 语言环境) 您正在使用命名语言环境,它是非 UTF-8 语言环境,并且哪个 perl
已确定与它可以处理的内容不完全兼容。 第二个 %s 给出了一个
原因。
警告类别“语言环境”是新的。
· localtime(%f) 失败
(W 溢出)你用一个它无法处理的数字调用了“localtime”:太大,
太小,或 NaN。 返回值为“undef”。
· 负重复计数没有任何作用
(W 数字)您尝试执行“x”重复运算符少于 0 次,这导致
没有意义。
· 不推荐使用字符名别名定义中的 NO-BREAK SPACE
(D deprecated) 您定义了一个包含不间断空格的字符名称
特点。 将其更改为常规空间。 通常这些名称定义在
":alias" 导入参数到 "use charnames",但它们可以由翻译器定义
安装到 $^H{charnames} 中。 请参阅字符名中的“自定义别名”。
· 非有限重复计数什么都不做
(W 数字)您试图执行“x”重复运算符“Inf”(或“-Inf”)或 NaN
次,这是没有意义的。
· PerlIO 层 ':win32' 是实验性的
(S Experiment::win32_perlio) ":win32" PerlIO 层是实验性的。 如果你想
要冒使用此层的风险,只需禁用此警告:
没有警告“experimental::win32_perlio”;
· ASCII 可打印的范围应该是正则表达式中“0-9”、“AZ”或“az”的某个子集;
由 <-- HERE 标记,单位为 m/%s/
(W regexp)(仅在“use re 'strict'”下或在“(?[...])”内)
更严格的规则有助于发现错别字和其他错误。 也许你甚至没有打算
范围在这里,如果“-”是其他字符,或者应该是
转义(如“\-”)。 如果您确实打算使用范围,则使用的范围不可移植
在 ASCII 和 EBCDIC 平台之间,并且对于一个随意的人来说没有明显的意义
读者。
[3-7] # 好的; 明显便携
[dg] # 好的; 明显便携
[AY] # 好的; 明显便携
[Az]# 错误; 不便携; 不清楚是什么意思
[aZ] # 错误; 不便携; 不清楚是什么意思
[%-。] # 错误的; 不便携; 不清楚是什么意思
[\x41-Z] # 错误; 不便携; 对于非极客来说并不明显
(您可以通过指定 Unicode 范围来强制可移植性,这意味着
端点由“\N{...}”指定,但含义可能仍然不明显。)
更严格的规则要求范围以 ASCII 字符开始或结束
不是控件的所有端点都是文字字符,而不是一些转义字符
序列(如“\x41”),并且范围必须全部为数字,或全部为大写字母,
或全部小写字母。
· 数字的范围应该来自正则表达式中的同一组; 由 <-- HERE 标记,单位为 m/%s/
(W regexp)(仅在“use re 'strict'”下或在“(?[...])”内)
更严格的规则有助于发现错别字和其他错误。 你包括了一个范围,并且在
至少有一个端点是十进制数字。 在更严格的规则下,当这
发生时,两个端点应该是同一组 10 个连续数字中的数字。
· %s 中的冗余参数
(W 冗余)您调用的函数的参数比所需的多,如所示
通过您提供的其他参数中的信息 (例如. printf 格式)。 目前
仅在 printf 类型格式需要的参数少于提供的参数时发出,
但将来可能会用于 例如 在 perlfunc 中“打包”。
警告类别“冗余”是新的。 另见 [perl #121025]
.
· 替换列表比搜索列表长
这不是新的诊断,但在早期版本中意外未显示
如果音译包含宽字符。 现在已修复,以便您可以
在您以前没有(但应该有)的地方看到此诊断。
· 对非 UTF-8 语言环境使用 \b{} 是错误的。 假设 UTF-8 语言环境
(W 语言环境) 您正在匹配使用语言环境规则的正则表达式和 Unicode
正在匹配边界,但语言环境不是 Unicode 语言环境。 这不会使
感觉。 Perl 将继续,假设 Unicode (UTF-8) 语言环境,但结果可能
除非语言环境恰好是 ISO-8859-1 (Latin1),否则这是错误的
消息是虚假的,可以忽略。
警告类别“语言环境”是新的。
· 在正则表达式中将 /u 用于 '%s' 而不是 /%s; 由 <-- HERE 标记,单位为 m/%s/
(W regexp) 您在 a 的一部分中使用了 Unicode 边界(“\b{...}”或“\B{...}”)
正则表达式,其中字符集修饰符“/a”或“/aa”有效。
这两个修饰符表示 ASCII 解释,这对于
Unicode 定义。 生成的正则表达式将编译,以便
边界使用所有 Unicode。 正则表达式的其他部分不受影响。
· 按位特征是实验性的
(S Experiment::bitwise) 如果您使用按位运算符 ("& | ^
~&。 |。 ^。 ~.") 并启用“按位”功能。如果出现以下情况,只需抑制警告
您想使用该功能,但要知道这样做的风险是
使用可能会在未来的 Perl 版本中更改或删除的实验性功能:
没有警告“实验::按位”;
使用“按位”特征;
$x |.= $y;
· 正则表达式中未转义的左大括号被弃用,在正则表达式中通过; 由 <-- 标记
这里以 m/%s/
(D deprecated, regexp) 您在正则表达式中使用了文字“{”字符
图案。 您应该改为使用“\{”,因为 Perl 的未来版本
(暂定 v5.26)会认为这是一个语法错误。 如果图案
分隔符也是大括号,任何匹配的右大括号(“}”)也应该转义为
避免混淆解析器,例如,
qr{abc\{def\}ghi}
· 不推荐在变量名中使用文字非图形字符
(D deprecated) 在源代码中使用文字非图形(包括控制)字符
参考 ^FO 变量,如 $^X 和 "${^GLOBAL_PHASE}" 现在已弃用。
· 属性“const”的无用使用
(W misc) 除了匿名闭包原型外,“const”属性没有任何影响。
您通过attributes.pm 将其应用到子程序。 这仅在内部有用
匿名子程序的属性处理程序。
· 在音译运算符中无用的使用 /d 修饰符
这不是新的诊断,但在早期版本中意外未显示
如果音译包含宽字符。 现在已修复,以便您可以
在您以前没有(但应该有)的地方看到此诊断。
· "use re 'strict'" 是实验性的
(S Experiment::re_strict) 正则表达式的不同之处
模式是在“严格”下编译的,在未来的 Perl 版本中可能会发生变化
不相容的方式; 也有建议更改如何启用严格检查
而不是使用这个子pragma。 这意味着今天编译的模式可能
不会在未来的 Perl 版本中。 此警告旨在提醒您注意该风险。
· 警告:无法正确关闭文件句柄:%s
警告: 无法正确关闭文件句柄 %s: %s
(S io) 以前,perl 在隐式关闭一个
文件句柄, 如 文件句柄的引用计数达到零并且
用户的代码尚未调用“close()”; 例如
{
打开我的 $fh, '>', $file or die "open: '$file': $!\n";
打印 $fh, $data 或 die;
} # 隐式关闭这里
在磁盘已满等情况下,由于缓冲,可能只能检测到错误
在最后关闭期间,因此不检查关闭结果是危险的。
所以 perl 现在会在这种情况下发出警告。
· %s 中的宽字符 (U+%X)
(W 语言环境) 而在单字节语言环境 (如, 一个非 UTF-8 的), 一个多字节
遇到了字符。 Perl 认为这个字符是指定的 Unicode
代码点。 结合非 UTF-8 语言环境和 Unicode 是危险的。 几乎肯定
有些字符会有两种不同的表示。 例如,在 ISO
8859-7(希腊语)语言环境,代码点 0xC3 代表大写 Gamma。 但也如此
是 0x393。 这将使字符串比较不可靠。
您可能需要弄清楚这个多字节字符是如何与您的
单字节语言环境(或者您可能认为自己有一个 UTF-8 语言环境,但 Perl
不同意)。
警告类别“语言环境”是新的。
更改 至 现有 诊断
· <> 应该是引号
此警告已更改为 <> 在 require-statement 应该是引号以使
问题更易识别。
· 参数 "%s" 不是数字%s
此警告的 perldiag 条目已添加此澄清说明:
请注意,对于 Inf 和 NaN(无穷大和非数字),
“数字”的定义有点不寻常:字符串本身
(如“Inf”)被认为是数字,其后的任何内容都是
视为非数字。
· 全局符号“%s”需要明确的包名
此消息已附加“(您是否忘记声明“我的 %s”?)”以使其
对新的 Perl 程序员更有帮助。 [perl #121638]
· “我的”变量 &foo::bar 不能在包中”已改写为“子程序”
而不是“变量”。
· \N{} 字符类限制为正则表达式中的一个字符; 标记为 <-- HERE in
多发性硬化症/
此消息已 字符 程 变成 倒 字符 程 or as a 范围
终点 is 反映“qr/[\N{named sequence}]/”的改进(见下
“选定的错误修复”)。
· 恐慌:frexp
此消息附加了“:%f”,以显示有问题的浮点数
数是。
· 可能存在 优先权 问题 on 按位 %c 操作者 改写为可能的优先级
按位 %s 运算符的问题。
· 包含换行符的文件名 %s 失败
现在仅当换行符位于文件名末尾时才会产生此警告。
· “变量 %s 将不会保持共享”已更改为“子程序”
实际上是一个不会保持共享的词法子集。
· 在正则表达式 m/%s/ 中未实现可变长度后视
此警告的 perldiag 条目已添加有关 Unicode 行为的信息。
诊断 清除
· “ -foo 的歧义使用被解析为 -&富()"
这里实际上没有歧义,这阻碍了否定常量的使用;
例如,“-Inf”。
·“常量不是 FOO 引用”
常量解引用的编译时检查(例如, "my_constant->()") 已经
删除,因为它没有考虑超载。 [perl #69456]
[perl #69456]
公用事业 更改
查找2perl, s2p 和 a2p 切除
· x2p/ 目录已从 Perl 核心中删除。
这将删除 find2perl、s2p 和 a2p。 它们都作为单独的发布到 CPAN
发行版(“App::find2perl”、“App::s2p”、“App::a2p”)。
每小时
· 每小时 现在处理编译器预定义宏定义中的十六进制常量,
在 $Config{cppsymbols} 中可见。 [perl #123784]
.
纠缠
· 不再依赖于非核心模块。
配置 和 汇编
· 配置 现在检查“lrintl()”、“lroundl()”、“llrintl()”和“llroundl()”。
· 配置 使用“-Dmksymlinks”现在应该更快。 [perl #122002]
.
· 默认情况下,“pthreads”和“cl”库将被链接(如果存在)。 这允许
需要线程处理非线程 perls 的 XS 模块。 请注意,您必须
如果你想要一个线程 perl,仍然通过“-Dusethreads”。
· 为了获得更高的浮点数精度和范围,现在可以使用 GCC
实现四倍精度浮点数的 quadmath 库
x86 和 IA-64 平台。 看 载点 了解详情。
· MurmurHash64A 和 MurmurHash64B 现在可以配置为内部散列函数。
· “make test.valgrind”现在支持并行测试。
例如:
TEST_JOBS=9 制作 test.valgrind
有关更多信息,请参阅 perlhacktips 中的“valgrind”。
[perl #121431]
· MAD(杂项属性装饰)构建选项已被删除
这是为了更忠实地保留 Perl 解析树而进行的一次未维护的尝试,因此
Perl 5 到 Perl 6 的自动转换会更容易。
这个构建时配置选项已经多年无人维护,并且可能已经
在 Perl 5 和 Perl 6 方面都存在严重分歧。
· 新的编译标志“-DPERL_OP_PARENT”可用。 有关详细信息,请参阅
下面在“内部变化”中讨论。
· Pathtools 不再尝试在 miniperl 上加载 XS。 这加快了构建 perl
略。
测试与验证
· t/移植/re_context.t 已添加以测试 utf8 及其依赖项仅使用
“Perl_save_re_context()”被硬编码到的“$1..$n”捕获变量的子集
localize,因为该函数没有有效的方法在运行时确定什么
本地化的变量。
· 文件中添加了性能问题的测试 t/perf/污点.t.
· 一些正则表达式测试的编写方式会导致它们运行非常缓慢
如果某些优化中断。 这些测试已移至新文件中,
t/re/速度.t 和 t/re/speed_thr.t,并使用“看门狗()”运行。
· “test.pl”现在允许“plan skip_all => $reason”,使其更兼容
“测试::更多”。
· 一个新的测试脚本, 操作/infnan.t, 已添加以测试无穷大和 NaN 是否有效
正确。 请参阅“改进的无穷大和 NaN(非数字)处理”。
平台 支持
失而复得 交易平台
IRIX 和 Tru64 平台再次运行。
一些“make test”失败仍然存在:[perl #123977]
和 [perl #123977]
对于 IRIX; [perl #125298]
, [cpan #124212]
, 和 [cpan #99605]
对于 Tru104836。
z/OS 运行 EBCDIC 代码页 1047
核心 perl 现在可以在这个 EBCDIC 平台上运行。 早期的 perls 也有效,但是,即使
虽然没有正式取消支持,但最近的 perls 不会编译和运行
好。 Perl 5.20 可以工作,但有许多现在已修复的错误。 许多 CPAN
Perl 附带的模块仍然无法通过测试,包括“Pod::Simple”。 但是,那
当前在 CPAN 上的“Pod::Simple”版本应该可以工作; 修复得太晚了
包含在 Perl 5.22 中。 修复许多仍然损坏的 CPAN 模块的工作正在进行中,
完成后可能会安装在 CPAN 上,因此您可能不必
等到 Perl 5.24 获得一个工作版本。
停产 交易平台
NextSTEP/OPENSTEP
NeXTSTEP 是与 NeXT 工作站捆绑在一起的专有操作系统
90 年代初至中期; OPENSTEP 是一个 API 规范,它提供了一个类似 NeXTSTEP 的
非 NeXTSTEP 系统上的环境。 两者现在都已经死了,所以支持建设
它们上的 Perl 已被删除。
特定于平台 笔记
EBCDIC
EBCDIC 平台上的 perl 解释器需要特殊处理才能获得
"qr/[ij]/" 只匹配 "i" 和 "j",因为代码之间有 7 个字符
点“i”和“j”。 这种特殊处理只有在两端都被调用时才被调用
范围是文字。 现在,如果任何 "\N{...}" 形式为
使用按名称或 Unicode 代码点指定字符而不是文字。
请参阅 perlrecharclass 中的“字符范围”。
HP-UX
archname 现在将 use64bitint 与 use64bitall 区分开来。
安卓
已改进了对一般交叉编译和 Android 中的构建支持
特定。
VMS
· 在不等待的情况下生成子进程时,返回值现在是正确的
PID。
· 修复原型,以便在 VMS C++ 编译器下链接不会失败。
·“configure.com”中添加了“finite”、“finitel”和“isfinite”检测,
环境处理有一些小的变化,并修复了遗留功能
检查状态。
Win32
· 小程序 现在使用“-fno-strict-aliasing”构建,允许 64 位构建
在 GCC 4.8 上完成。 [perl #123976]
· “nmake minitest”现在可以在 Win32 上运行。 由于依赖问题,您需要构建
“nmake test-prep”首先,少数测试失败。 [perl #123394]
· 现在可以通过设置 makefile 宏在 Windows 上以 C++ 模式构建 Perl
“USE_CPLUSPLUS”到值“define”。
· Win32 实现了管道打开的列表形式。 注意:不同于“系统
LIST”这不会退回到 shell。[perl #121159]
· 新的“DebugSymbols”和“DebugFull”配置选项添加到 Windows
生成文件。
· 以前,使用 Visual C++ for Win64 编译 XS 模块(包括 CPAN 模块)
导致每个文件大约有十几个警告来自 hv_func.h. 这些警告有
被沉默。
· 对不使用 PerlIO 的构建的支持已从 Windows 生成文件中删除。
非 PerlIO 构建在 Perl 5.18.0 中几乎被弃用,并且已经不是
通过支持 配置 在 POSIX 系统上。
· 在 2 到 6 毫秒之间,每次尝试节省了 XNUMX 个 I/O 调用
为@INC 中的每个路径打开一个 perl 模块。
· Intel C 版本现在总是在 C99 模式下构建。
· %I64d 现在用于 MinGW,而不是 %lld。
· 在实验性的 ":win32" 层中,修复了 "open" 中的崩溃。 也开
的/ dev / null的 (在 Win32 Perl 的默认 ":unix" 层下工作)已实现
对于 ":win32"。 [perl #122224]
· 新的 makefile 选项“USE_LONG_DOUBLE”已添加到 Windows dmake
仅用于 gcc 构建的 makefile。 如果您希望 perl 使用 long,请将其设置为“define”
doubles 为浮点数提供更高的精度和范围。
OpenBSD系统
在 OpenBSD 上,出于安全考虑,Perl 现在将默认使用系统“malloc”
它提供的功能。 Perl 自己的 malloc 包装器从 v5.14 开始使用,原因是
性能原因,但 OpenBSD 项目认为这种权衡是值得的,并且
更喜欢需要速度的用户特别要求它。
[perl #122000] .
的Solaris
· 我们现在在两者中寻找 Sun Studio 编译器 /选择/solstudio* 和
/选择/solarisstudio*.
· 使用“-Dusedtrace”在 Solaris 10 上构建会提前失败,因为 make 没有遵循
构建“perldtrace.h”的隐含依赖项。 添加了显式依赖项
“依靠”。 [perl #120120]
· C99选项已被清理; 提示寻找“solstudio”以及
"SUNWspro"; 并添加了对本机“setenv”的支持。
全内走线 更改
· 添加了实验性支持,允许 optree 中的 ops 找到它们的父级,
如果有的话。 这是由非默认构建选项“-DPERL_OP_PARENT”启用的。 它是
设想这最终会在默认情况下启用,因此 XS 代码
直接访问 ops 的“op_sibling”字段应该更新为未来 -
证明。
在“PERL_OP_PARENT”构建中,“op_sibling”字段已重命名为“op_sibparent”和
添加了一个新标志“op_moresib”。 在同级链中的最后一个操作上,“op_moresib”是
false 和“op_sibparent”指向父级(如果有)而不是“NULL”。
无论是否使用“PERL_OP_PARENT”,为了使现有代码透明地工作,
添加了一些应该使用的新宏和函数,而不是
直接操作“op_sibling”。
对于只读取“op_sibling”来确定下一个兄弟的情况,两个新的
已添加宏。 像这样对同级链进行简单扫描:
for (;kid->op_sibling;kid =kid->op_sibling) { ... }
现在应该写成:
for (; OpHAS_SIBLING(kid); Kid = OpSIBLING(kid)) { ... }
为了改变 opttree,添加了一个通用函数“op_sibling_splice()”,
这允许操纵一系列兄弟操作。 类比于 Perl
函数“splice()”,它允许您从同级链中切出零个或多个操作
并用零个或多个新操作替换它们。 它透明地处理所有更新
兄弟、父、op_last 指针等。
如果您需要在较低级别操作操作,那么三个新的宏,
“OpMORESIB_set”、“OpLASTSIB_set”和“OpMAYBESIB_set”旨在作为低级
设置“op_sibling”/“op_sibparent”同时更新“op_moresib”的可移植方式。
第一个将兄弟指针设置为一个新的兄弟,第二个使操作成为最后一个
兄弟,第三个有条件地执行第一个或第二个动作。 注意
与“op_sibling_splice()”不同,这些宏不会在父级中保持一致性
同一时间 (例如 通过在适当的情况下更新“op_first”和“op_last”)。
C 级“Perl_op_parent()”函数和 Perl 级“B::OP::parent()”方法具有
已添加。 C 函数仅存在于“PERL_OP_PARENT”构建下(使用它是
vanilla perls 的构建时错误)。 "B::OP::parent()" 始终存在,但在香草上
构建它总是返回“NULL”。 在“PERL_OP_PARENT”下,它们返回
当前操作,如果有的话。 变量 $B::OP::does_parent 允许您确定是否
“B”支持检索操作的父级。
“PERL_OP_PARENT”是在 5.21.2 中引入的,但是界面有很大的变化
在 5.21.11。 如果您在 5.21.11 更改之前更新了代码,则可能需要
进一步修订。 5.21.2之后的主要变化是:
· “OP_SIBLING”和“OP_HAS_SIBLING”宏已更名为“OpSIBLING”和
“OPHAS_SIBLING”用于与其他操作操作的宏保持一致。
· “op_lastsib”字段已重命名为“op_moresib”,其含义颠倒了。
· 宏“OpSIBLING_set”已被删除,并被取代
“OpMORESIB_set” et al.
· “op_sibling_splice()”函数现在接受一个空的“父”参数,其中
拼接不会影响兄弟链中的第一个或最后一个操作
· 已创建宏以允许 XS 代码更好地操作 POSIX 语言环境
类别“LC_NUMERIC”。 请参阅 perlapi 中的“与区域设置相关的函数和宏”。
· 以前的“atoi” et al 替换函数“grok_atou”现已被取代
通过“grok_atoUV”。 有关详细信息,请参阅 perlclib。
· 添加了一个新函数“Perl_sv_get_backrefs()”,它允许您检索
弱引用,如果有的话,指向一个 SV。
· 删除了“screaminstr()”函数。 虽然标记为公共 API,但它是
未记录且未在 CPAN 模块中使用。 自 5.17.0 以来,调用它一直是致命的。
· “newDEFSVOP()”、“block_start()”、“block_end()”和“intro_my()”函数具有
已添加到 API。
· 内部“转换”功能在 操作 已重命名为“op_convert_list”并添加
API。
· “sv_magic()”函数不再禁止对只读值使用“ext”魔法。 后
所有,perl 不知道自定义魔法是否会修改 SV。 [perl
#123103] .
· 现在禁止在 XSUB 上访问 perlapi 中的“CvPADLIST”。
“CvPADLIST”字段已被重新用于 XSUB 的不同内部目的。 所以
特别是,您不能再依赖它为 NULL 来测试 CV 是否为
XSUB。 请改用“CvISXSUB()”。
· “SVt_NV”类型的 SV 现在有时在构建配置和
平台允许它:具体来说,当“sizeof(NV) <= sizeof(IV)”时。 “无体”是什么意思
NV 值直接存储在 SV 的头部,而不需要一个
单独的身体被分配。 自 5.9.2 以来,此技巧已用于 IV
(虽然在 IVs 的情况下,它总是被使用,无论平台和构建
配置)。
· $DB::single、$DB::signal 和 $DB::trace 变量现在具有 set- 和 get-magic
将它们的值存储为 IV,并且在测试它们的值时使用这些 IV
“pp_dbstate()”。 如果重载的对象,这可以防止 perl 无限递归
分配给这些变量中的任何一个。 [perl #122445]
.
· “Perl_tmps_grow()”,被标记为公共API但未记录,已被
从公共 API 中删除。 此更改不会影响使用
“EXTEND_MORTAL”宏用于预扩展凡人堆栈。
· Perl 的内部结构不再设置或使用“SVs_PADMY”标志。 “SvPADMY()”现在返回
任何未标记为“PADTMP”和“SVs_PADMY”的真实值现在定义为 0。
· 删除了宏“SETsv”和“SETsvUN”。 它们不再用于
核心自五年前提交 6f1401dc2a 以来,尚未在 CPAN 上发现。
· David Mitchell 非正式地保留了“SvFAKE”位(未在 HV 上使用)以备将来使用
在 vtables 上工作。
· “sv_catpvn_flags()”函数接受“SV_CATBYTES”和“SV_CATUTF8”标志,
分别指定附加的字符串是字节还是 UTF-8。 (这些标志有
实际上自 5.16.0 以来就存在,但以前不被视为 API 的一部分。)
· 引入了新的操作码类“METHOP”。 它保存用于的信息
运行时以提高类/对象方法调用的性能。
“OP_METHOD”和“OP_METHOD_NAMED”已从“UNOP/SVOP”更改为
“方法论”。
· "cv_name()" 是一个新的 API 函数,可以传递一个 CV 或 GV。 它返回一个 SV
包含子程序的名称,用于诊断。
[perl #116735] [perl #116735]
· "cv_set_call_checker_flags()" 是一个新的 API 函数,它的工作原理类似于
"cv_set_call_checker()",除了它允许调用者指定调用是否
检查器需要一个完整的 GV 来报告子程序的名称,或者它是否可以
而是通过了简历。 “cv_name()”可以接受任何传递的值。
"cv_set_call_checker()" 保证会有一个 GV,但它可能必须创建一个
在运行中,这是低效的。 [perl #116735]
· “CvGV”(不是 API 的一部分)现在是一个更复杂的宏,它可以调用
功能并具体化 GV。 对于那些被用作布尔值的情况,
添加了“CvHASGV”,对于名义上具有 GV 的 CV,它将返回 true,但是
不具体化 GV。 “CvGV”现在也为词法 subs 返回一个 GV。 [perl
#120441]
· perlapi 函数中的“sync_locale”已添加到公共API。 改变
XS 代码应避免使用程序的语言环境。 尽管如此,某些非 Perl
从 XS 调用的库需要这样做,例如“Gtk”。 当这种情况发生时,Perl 需要
被告知语言环境已更改。 在返回之前使用此函数执行此操作
到 Perl。
· OP 的“op_private”字段中标志的定义和标签现在是自动的
从数据生成 再生/op_private. 这样做的显着影响是一些
“Concise”的标志输出可能略有不同,而“Concise”的标志输出
"perl -Dx" 可能有很大不同(它们现在都使用相同的标签集)。 还,
调试版本现在在“op_free()”中有一个新的断言,以确保操作不会
在“op_private”中设置了任何无法识别的标志。
· 不推荐使用的变量“PL_sv_objcount”已被删除。
· Perl 现在尝试将语言环境类别“LC_NUMERIC”设置为“C”,除了周围
需要将其设置为程序的底层语言环境的操作。 这保护
许多 XS 模块无法处理不是点的十进制小数字符。
在此版本之前,Perl 将此类别初始化为“C”,但调用
"POSIX::setlocale()" 会改变它。 现在这样的调用将改变底层
程序的“LC_NUMERIC”类别的语言环境,但暴露于 XS 代码的语言环境
将保持“C”。 有新的宏来操作 LC_NUMERIC 语言环境,包括
“STORE_LC_NUMERIC_SET_TO_NEEDED”和“STORE_LC_NUMERIC_FORCE_TO_UNDERLYING”。 看
perlapi 中的“与区域设置相关的函数和宏”。
· 编写了一个新的宏“isUTF8_CHAR”,可以有效地确定字符串
由其参数给出的以格式良好的 UTF-8 编码字符开头。
· 删除了以下私有 API 函数的上下文参数:
"Perl_cast_ulong", "Perl_cast_i32", "Perl_cast_iv", "Perl_cast_uv",
"Perl_cv_const_sv", "Perl_mg_find", "Perl_mg_findext", "Perl_mg_magical",
“Perl_mini_mktime”、“Perl_my_dirfd”、“Perl_sv_backoff”、“Perl_utf8_hop”。
请注意,作为公共 API 一部分的那些函数的无前缀版本,
例如“cast_i32()”,不受影响。
· "PADNAME" 和 "PADNAMELIST" 类型现在是独立的类型,不再是简单的
SV 和 AV 的别名。 [perl #123223]
.
· Pad 名称现在总是 UTF-8。 “PadnameUTF8”宏始终返回 true。
以前,这实际上已经是这种情况,但是对两种不同的
焊盘名称的内部表示现在已被删除。
· 添加了新的操作类“UNOP_AUX”。 这是“UNOP”的子类,带有
添加了“op_aux”字段,它指向一组 UV、SV* 等的并集。它是
用于 op 需要存储比简单的“op_sv”或其他任何东西更多的数据的地方。
目前这种类型的唯一操作是“OP_MULTIDEREF”(见下一项)。
· 添加了一个新的操作,“OP_MULTIDEREF”,它执行一个或多个嵌套数组和
键是常量或简单变量的哈希查找。 例如
表达式 $a[0]{$k}[$i],之前涉及十个“rv2Xv”、“Xelem”、“gvsv”和
“const”操作现在由单个“multideref”操作执行。 它还可以处理“本地”,
“存在”和“删除”。 一个非简单的索引表达式,比如“[$i+1]”还是做的
使用“aelem”/“helem”,并且具有小的常量索引的单级数组查找是
仍然使用“aelemfast”完成。
选 问题 修复
· “关闭”现在设置 $!
当发生 I/O 错误时,已发生错误的事实被记录在
处理。 对于这样的句柄,“close”返回 false。 以前,价值 $! 将
不受“关闭”的影响,所以通常写成“关闭 $fh 或死 $!” 做过
不能可靠地工作。 现在句柄也记录了 $! 的值,并且“close”恢复
它。
· “no re”现在可以关闭所有“use re”启用的东西
以前,运行“no re”只会关闭一些东西。 现在它可以关闭所有
启用的东西。 例如,一旦启用,停止调试的唯一方法是
退出封闭块; 现在是固定的。
· "pack("D", $x)" 和 "pack("F", $x)" 现在将 x86 long double 构建中的填充置零。
在 GCC 4.8 及更高版本的某些构建选项下,它们过去要么覆盖零-
初始化填充,或完全绕过初始化缓冲区。 这导致 操作/包.t
失败。 [perl #123971]
· 扩展从父线程克隆的数组可能会导致“修改
尝试修改新元素时出现只读值尝试”错误。[perl
#124127]
· 断言失败和随后的崩溃与“*x= "已修复。[perl
#123790]
· 与编译词法 subs 相关的一个可能的崩溃/循环错误已得到修复。
[perl #124099]
· UTF-8 现在可以在函数名、未加引号的 HERE 文档终止符中正常工作,
并在用作数组索引的变量名中。 [perl #124113]
· 标量上下文中大型受污染字符串的重复全局模式匹配是
根据字符串中的当前匹配位置呈指数缓慢增长。 [perl
#123202]
· 由于语法错误导致解析器混淆的各种崩溃已得到修复。
[perl #123801] [perl #123801]
[perl #123802]
[perl #123955]
· 词法 $_ 范围内的“分裂”已修复,不会使断言失败。 [perl
#123763]
· 各种列表运算符中的“my $x : attr”语法不再使断言失败。 [perl
#123817]
· 引号中的“@”符号后跟非 ASCII 数字(不是有效标识符)
会导致解析器崩溃,而不是简单地尝试“@”作为文字。 这
已修复。 [perl #123963]
· "*bar::=*foo::=*glob_with_hash" 从 Perl 5.14 开始一直崩溃,但现在不会了。
[perl #123847]
· 标量上下文中的“foreach”没有将项目推入堆栈,导致
错误。 ("print 4, scalar do { foreach(@x){} } + 1" 将打印 5。) 已修复
返回“undef”。 [perl #124004]
· 核心C代码中用于存储环境变量内容的数据的几种情况
在使用之前可能被覆盖已修复。 [perl #123748]
· 一些以"开头的模式/.*..../" 匹配长字符串很慢
从 v5.8 开始,以及一些形式“/.*..../i" 自 v5.18 以来一直很慢。他们现在
一切又快了。 [perl #123743] .
· $/ 的原始可见值现在在设置为无效值时保留。
以前,如果您将 $/ 设置为对数组的引用,例如,perl 会生成一个
运行时错误并没有设置“PL_rs”,但是检查 $/ 的 Perl 代码会看到数组
参考。 [perl #123218] .
· 在正则表达式模式中,POSIX 类,如“[:ascii:]”,必须在一个
括号内的字符类,如“qr/[[:ascii:]]/”。 当某事发生时发出警告
看起来像 POSIX 类不在括号内。 那个警告不是
当 POSIX 类被否定时生成:“[:^ascii:]”。 现在已修复。
· Perl 5.14.0 引入了一个错误,“eval { LABEL: }”会崩溃。 这已经
固定的。 [perl #123652] .
· 由于语法错误导致解析器混淆的各种崩溃已得到修复。
[perl #123617] . [perl #123617]
. [perl #123737]
. [perl #123753]
.
· 像“/$a[/”这样的代码用于读取下一行输入并将其视为输入
紧接在开括号之后。 一些无效的代码因此会解析和
运行,但一些代码导致崩溃,所以现在不允许这样做。 [perl #123712]
.
· 修复“pack”的参数下溢。 [perl #123874]
.
· 修复对非严格“\x{}”的处理。 现在 "\x{}" 等价于 "\x{0}" 而不是
故障。
· “stat -t”现在不再被视为可堆叠,就像“-t stat”一样。 [perl #123816]
.
· 以下不再导致 SEGV:“qr{x+(y(?0))*}”。
· 修正了在正则表达式模式中解析反向引用时的无限循环。
· Infinity 和 NaN 行为中的几个小错误修复,包括警告
字符串化类似无穷大或类似 NaN 的字符串。 例如,“NaNcy”不会麻木到
不再是NaN了。
· 可能导致段错误和其他崩溃的正则表达式模式中的错误
已修复。 这仅发生在使用“/i”编译的模式中,同时考虑
考虑当前的 POSIX 语言环境(这通常意味着它们必须在
"use locale" 的范围),并且必须有至少 128 个连续的字符串
要匹配的字节。 [perl #123539] .
· "s///g" 现在可以处理很长的字符串(超过 2 亿
迭代)而不是死于“替换循环”。 [perl #103260]
. [perl #103260]
.
· “gmtime”不再因非数字值而崩溃。 [perl #123495]
.
· "\()"(对空列表的引用)和作用域为词法 $_ 的 "y///" 都可以
在堆栈末尾进行错误写入。 它们都已被修复以延长
先堆叠。
· “prototype()”没有参数用于读取堆栈上的前一项,所以
"print "foo",prototype()" 会打印 foo 的原型。 已修复推断 $_
反而。 [perl #123514] .
· 在预先声明的 subs 中声明的词法状态 subs 的一些情况可能会崩溃,因为
评估包含外部变量名称的字符串时的示例,但不再
的事。
· 匿名 subs 中嵌套词法状态 subs 的某些情况可能会导致“奇怪的
复制'错误甚至可能崩溃。
· 当试图发出警告时,perl 的默认调试器 (perl5db.pl) 有时
改为给出“未定义的子程序 &DB::db_warn 调用”。 这个错误,开始
发生在 Perl 5.18 中,已修复。 [perl #123553]
.
· 替换中的某些语法错误,例如“s/${<>{})//”,会崩溃,并有
从 Perl 5.10 开始这样做。 (在某些情况下,崩溃直到 5.16 才开始发生。)
当然,崩溃已经得到修复。 [perl #123542]
.
· 修复几个字符串增长大小计算溢出的问题; 特别是重复
像“33 x ~3”这样的表达式可能会导致大缓冲区溢出,因为新输出
“SvGROW()”未正确处理缓冲区大小。 现在这样的表情
正确地产生内存包装恐慌。 [perl #123554]
.
· "formline("@...", "a");" 会崩溃。 “pp_formline()”中的“FF_CHECKNL”案例没有
设置用于标记斩波位置的指针,这导致了“FF_MORE”的情况
因分段错误而崩溃。 这已被修复。 [perl #123538]
.
· 在常规期间解析文字模式时可能出现缓冲区溢出和崩溃
表达式编译已得到修复。 [perl #123604]
.
· "fchmod()" 和 "futimes()" 现在设置 $! 当他们因为传递一个关闭的文件而失败时
处理。 [perl #122703] .
· "op_free()" 和 "scalarvoid()" 不再因释放一个栈时的堆栈溢出而崩溃
深度递归运算树。 [perl #108276]
.
· 在 Perl 5.20.0 中,$^N 在访问时意外关闭了内部 UTF-8 标志
从正则表达式中的代码块,有效地对值进行 UTF-8 编码。
这已被修复。 [perl #123135]
.
· 失败的“semctl”调用不再覆盖堆栈上的现有项目,这意味着
“(semctl(-1,0,0,0))[0]”不再给出“未初始化”警告。
· 在“foo”之前没有空格的“else{foo()}”现在可以更好地分配正确的行
该语句的编号。 [perl #122695]
.
· 有时“@array = split”中的赋值会得到优化,以便“split”本身
直接写入数组。 这导致了一个错误,阻止了这个分配
在左值上下文中使用。 所以 "(@a=split//,"foo")=bar()" 是一个错误。 (这个错误
可能会追溯到 Perl 3,当时添加了优化。)现在已经修复。
[perl #123057] .
· 当参数列表未通过子程序签名(即
仍然是一个实验性功能),产生的错误消息现在给出了文件和
调用者的行号,而不是被调用子程序的行号。 [perl #121374]
.
· 触发器运算符(标量上下文中的“..”和“...”)用于维护一个单独的
每个递归级别的状态(调用封闭子的次数
递归),与文档相反。 现在每个闭包都有一个内部状态
对于每个触发器。 [perl #122829]
.
· 触发器运算符(标量上下文中的“..”)将返回相同的标量
时间,除非包含子程序被递归调用。 现在它总是返回
一个新的标量。 [perl #122829] .
· “use”、“no”、语句标签、特殊块(“BEGIN”)和 pod 现在被允许作为
“map”或“grep”块中的第一件事,“print”或“say”(或其他
函数)返回一个句柄,并在“${...}”、“@{...}”等内。 [perl #122782]
.
· 重复运算符“x”现在将左值上下文传播到其左侧参数
在“foreach”等上下文中使用时。 这允许“for(($#that_array)x2) { ... }”
如果循环修改 $_,则按预期工作。
· "(...) x ..." 在标量上下文中用于破坏堆栈,如果一个操作数是一个对象
与“x”重载,导致不稳定的行为。 [perl #121827]
.
· 对词法标量的赋值经常被优化掉; 例如在“我的 $x; $x = $y
+ $z",赋值运算符被优化掉,加运算符写入其结果
直接到$x。 与此优化相关的各种错误已得到修复。 肯定
右侧的运算符有时根本无法分配值或
分配错误的值,或者在绑定变量上调用 STORE 两次或根本不调用。
受影响的运算符是“使用整数”下的“$foo++”、“$foo--”和“-$foo”,
“chomp”、“chr”和“setpgrp”。
· 如果相同的标量最终出现在列表的两侧,则列表分配有时会出错
由于使用“绑定”、“值”或“每个”而导致的分配。 结果会是错误的
值被分配。
· "setpgrp($nonzero)"(带一个参数)在 5.16 中意外更改为
设置组(0). 这已被修复。
· "__SUB__" 可能会返回错误的值,甚至在调试器下损坏内存(
“-d”开关)和包含“eval $string”的子文件。
· 当 "sub () { $var }" 变为可内联时,它现在每次都返回不同的标量,
就像不可内联的 sub 一样,尽管 Perl 仍然会在某些情况下优化副本
它不会产生明显的差异。
· "my sub f() { $var }" 和 "sub () : attr { $var }" 不再有资格获得
内联。 前者会崩溃; 后者只会扔掉这些属性。
鲜为人知的“:method”属性例外,它什么都不做
许多。
· 内联带有空原型的 subs 现在比以前更加一致。
以前,一个包含多条语句的子语句,除最后一条语句外,所有语句都进行了优化
离开,只有当它是一个包含字符串“eval”的匿名子时才会内联
或“状态”声明或关闭外部词法变量(或任何匿名子
在调试器下)。 现在任何在之后折叠成单个常量的子
语句已经被优化掉了可以进行内联。 这适用于事物
比如“sub () { jabber() if DEBUG; 42 }”。
一些具有显式“返回”的子例程被内联,这与
文档,现在“返回”总是防止内联。
· 在某些系统上,例如 VMS,“crypt”可以返回一个非 ASCII 字符串。 如果一个标量
分配给之前包含一个 UTF-8 字符串,则“crypt”不会关闭
UTF-8 标志,从而破坏返回值。 这会发生在
“$lexical = crypt ...”。
· "crypt" 不再在绑定的第一个参数上调用 "FETCH" 两次。
· 类似引号的操作符("qq[${ <
"/(?{ <
· "index()" 和 "rindex()" 在超过 2GB 的字符串上使用时不再崩溃。 [perl
#121562] .
· "PERL_SYS_INIT"/"PERL_SYS_INIT3" 上的一个小的、以前故意的内存泄漏
Win32 构建是固定的。 这可能会影响反复创建和销毁的嵌入器
同一进程内的 perl 引擎。
· "POSIX::localeconv()" 现在甚至返回程序底层语言环境的数据
当从“使用语言环境”的范围之外调用时。
· “POSIX::localeconv()”现在可以在没有“LC_NUMERIC”的平台上正常工作
和/或“LC_MONETARY”,或者已编译 Perl 以忽略其中一个或两者
这些语言环境类别。 在这种情况下,现在没有条目
“localeconv()”返回的散列中的相应值。
· "POSIX::localeconv()" 现在适当地标记它返回的值是否为 UTF-8。
以前它们总是作为字节返回,即使它们应该是
编码为 UTF-8。
· 在 Microsoft Windows 上,在“use locale”范围内,以下 POSIX 字符
类给出了许多不符合 POSIX 标准的语言环境的结果:
"[[:alnum:]]", "[[:alpha:]]", "[[:blank:]]", "[[:digit:]]", "[[:graph:]]",
"[[:lower:]]", "[[:print:]]", "[[:punct:]]", "[[:upper:]]", "[[:word:]]",和
“[[:xdigit:]]”。 这是因为底层的 Microsoft 实现没有
遵循标准。 Perl 现在采取特别的预防措施来纠正这一点。
· Coverity检测到很多问题http://www.coverity.com/> 并固定。
· "system()" 和朋友现在应该可以在更多的 Android 版本上正常工作。
由于疏忽,通过“-Dtargetsh”指定的值 配置 会结束
up 被某些构建过程忽略。 这导致 perls 交叉编译为
Android 最终会出现“system()”、“exec()”和反引号的缺陷版本:
命令最终会寻找“/ bin / sh的" 而不是 "/system/bin/sh",所以
绝大多数设备失败,留下 $! 作为“ENOENT”。
· "qr(...\(...\)...)"、"qr[...\[...\]...]"和"qr{...\{.. .\}...}”现在工作。
以前不可能用反斜杠转义这三个左字符
在正则表达式模式中,否则它们将被考虑
元字符,模式开始定界符是字符,结束符是
分隔符是它的镜像字符。
· 受污染的 UTF-8 字符串上的“s///e”损坏了“pos()”。 这个错误,在 5.20 中引入,是
现在固定。 [perl #122148] .
· 正则表达式中的非单词边界(“\B”)并不总是匹配
细绳; 特别是 "q{} =~ /\B/" 不匹配。 这个错误是在 perl 5.14 中引入的,
现在已修复。 [perl #122090] .
· ""P" =~ /(?=.*P)P/" 应该匹配,但没有匹配。 现在已修复。 [perl #122171]
.
· 未能在“eval”中编译“use Foo”可能会留下虚假的“BEGIN”子例程
定义,这将在下次使用时产生“子程序开始重新定义”警告
“使用”或其他“开始”块。 [perl #122107]
.
· “method { BLOCK } ARGS”语法现在正确解析参数,如果它们以
一个开口支撑。 [perl #46947] .
· 外部库和 Perl 可能对语言环境有不同的看法。 这是
如果区域设置的数字分隔符已被解析,则在解析版本字符串时会出现问题
改变了。 版本解析已被修补以确保它正确处理语言环境。
[perl #121930] .
· 正则表达式中零长度断言和代码块的错误已得到修复
可能导致“pos”看到不正确的值。 [perl #122460]
.
· 取消引用常量现在可以正确用于 typeglob 常量。 以前的
glob 被字符串化并且它的名字被查找。 现在使用 glob 本身。 [perl
#69456]
· 当解析一个 sigil ("$" "@" "%" "&)" 后跟大括号时,解析器不再尝试
猜测它是块还是散列构造函数(当它出现时会导致语法错误)
猜测后者),因为它只能是一个块。
· "undef $reference" 现在立即释放所指对象,而不是一直挂在它上面
直到下一个语句。 [perl #122556]
· 使用子名称的各种情况(自动加载、重载、错误消息)
曾经因词法潜艇而崩溃,但已修复。
· 裸字查找现在会尝试避免在发现裸字是
不会是子程序名称。
· 匿名常量的编译(例如, "sub() { 3 }") 不再删除任何
当前包中名为“__ANON__”的子程序。 不仅是“*__ANON__{CODE}”
清除了,但也有内存泄漏。 这个错误可以追溯到 Perl 5.8.0。
· 像“sub f;”这样的存根声明和“sub f();” 不再消除常数
“使用常量”声明的相同名称。 这个错误是在 Perl 5.10.0 中引入的。
· "qr/[\N{named sequence}]/" 现在可以在许多情况下正常工作。
"\N{...}" 已知的一些名称指的是多个字符的序列,而不是
通常的单个字符。 带括号的字符类通常只匹配单个
字符,但现在添加了特殊处理,以便它们可以匹配命名
序列,但如果类被反转或序列被指定为
范围的开始或结束。 在这些情况下,与之前相比的唯一行为变化是
当这个类是一个的一部分时给出的致命错误消息的轻微改写
"?[...])" 构造。 当“[...]”单独存在时,与以下相同的非致命警告
before 被引发,并且只使用序列中的第一个字符,就像
过。
· 在编译时评估的被污染的常量不再导致无关的语句
被污染。 [perl #122669]
· "open $$fh, ...", 它使一个名字像 "main::_GEN_0" 的句柄生动起来,不是
为句柄提供正确的引用计数,因此可能会发生双重释放。
· 当决定一个裸字是一个方法名时,解析器会感到困惑,如果
存在同名的“our”子,在包中查找方法
“我们的”子,而不是调用者的包。
· 解析器不再被双引号字符串中的“\U=”弄糊涂。 它曾经
产生语法错误,但现在编译正确。 [perl #80368]
· 一直是“-B”和“-T”文件测试操作符处理的用意
UTF-8 编码的文件作为文本。 (perlfunc 已更新以说明这一点。)以前,它
某些文件可能被视为 UTF-8,但实际上并不是有效的 UTF-8。
现在已修复。 运营商现在也在 EBCDIC 平台上工作。
· 在某些情况下,在正则表达式模式期间引发警告消息
编译被输出不止一次。 现在已经解决了这个问题。
· Perl 5.20.0 引入了回归,其中使用 UTF-8 编码的正则表达式
包含单个 ASCII 小写字母的模式与其大写不匹配
对应物。 这已在 5.20.1 和 5.22.0 中得到修复。 [perl #122655]
· 如果词法警告(“使用
警告”或“无警告”)在编译时无效并且 $^W 为假,并且
运行时为真。
· 在正则表达式匹配期间加载 Unicode 表可能导致断言
如果前一个匹配使用相同的正则,则调试构建失败
表达。 [perl #122747]
· 线程克隆用于词法 subs 的工作不正确,可能导致崩溃或
退出时双重释放。
· 从 Perl 5.14.0 开始,删除 $SomePackage::{__ANON__} 然后取消定义匿名
子程序可能会在内部破坏事物,导致 Devel::Peek 崩溃或 B.pm
提供无意义的数据。 这已被修复。
· "(caller $n)[3]" 现在报告词法 subs 的名称,而不是将它们视为
“(未知)”。
· “排序子名列表”现在支持使用词法子作为比较例程。
· 别名(例如, 通过 "*x = *y") 可能会混淆提到这两个的列表分配
两侧的相同变量的名称,导致分配错误的值。
[perl #15667]
· 长的 here-doc 终止符可能会导致对短行输入的错误读取。 这有
已修复。 是否会发生任何坠机事件值得怀疑。 这个错误可以追溯到
二十五年前,当 here-docs 在 Perl 3.000 中被引入时。
· "split" 中的优化处理 "split /^/" 就像 "split /^/m" 不幸的是
也将“split /\A/”视为“split /^/m”的副作用,这是不应该的。
这已被修复。 (但是请注意,“split /^x/” 的行为不像
“split /^x/m”,这也被认为是一个错误,将在未来修复
版本。) [perl #122761]
· 鲜为人知的“my Class $var”语法(参见字段和属性)可能会引起混淆
在“使用 utf8”范围内,如果“Class”是一个常量,其值包含 Latin-1
字符。
· 通过 Hash::Util 或“Internals::SvREADONLY”锁定和解锁值不再具有
对开始时只读的值的任何影响。 以前,解锁这样的
值可能会导致崩溃、挂起或其他不稳定的行为。
· 正则表达式中的一些未终止的“(?(...)...)”结构要么崩溃
或给出错误的错误信息。 “/(?(1)/”就是这样的一个例子。
· "pack "w", $tied" 不再两次调用 FETCH。
· 像 "($x, $z) = (1, $y)" 这样的列表赋值现在可以正常工作,如果 $x 和 $y 已经
别名为“foreach”。
· 一些模式,包括有语法错误的代码块,例如“/ (?{(^{})/”,
在调试构建时挂起或失败断言。 现在他们产生错误。
· 已修复在启用调试的情况下解析“排序”时的断言失败。 [perl
#122771] .
· "*a = *b; @a = split //, $b[1]" 可能会读取错误并产生垃圾结果。
· 在"() = @array = split"中,开头的"()="不再混淆优化器
假设极限为 1。
· 致命警告不再阻止语法错误的输出。 [perl #122966]
.
· 修复了 VMS 上的 NaN double-to-long-double 转换错误。 对于安静的 NaN(并且仅在
产生了 Itanium,而不是 Alpha) 负无穷大而不是 NaN。
· 修复了“make distclean”错误留下一些文件的问题。
[perl #122820] .
· AIX 现在可以正确设置“getsockopt”中的长度。 [perl #120835]
. [cpan #120835]
. [cpan #91183]
.
· 正则表达式编译的优化阶段可能会“永远”运行并耗尽所有
某些情况下的记忆; 现在固定。 [perl #122283]
.
· 测试脚本 t/op/crypt.t 现在使用 SHA-256 算法,如果默认算法是
禁用,而不是失败。 [perl #121591]
.
· 修复了设置共享数组大小时的一个错误。 [perl #122950]
.
· 修复了可能导致 perl 在编译期间进入无限循环的错误。 在
特别地,一个 而(1) 在子列表中, 例如
sub foo { () = ($a, 我的 $b, ($c, do { 而(1) {} })) }
该错误是在 5.20.0 [perl #122995] 中引入的
.
· 在 Win32 上,如果一个变量在后来分叉的伪进程中被“本地”化,
在子伪进程中恢复原始值导致内存损坏和
子伪进程(以及操作系统进程)崩溃。 [perl #40565]
.
· 在带有 "^**" 字段的格式上调用 "write" 可能会在 "sv_chop()" 中产生一个恐慌,如果
参数不足或用于填充字段的变量是否为空。
[perl #123245] .
· 非 ASCII 词法子名称现在出现错误时不会出现尾随垃圾
消息。
· "\@" 子程序原型不再将带括号的数组变平(取一个
引用每个元素),但引用数组本身。 [perl #47363]
.
· 除了 C 风格的“for”循环之外什么都不包含的块可能会破坏堆栈,
导致块外的列表丢失元素或覆盖元素。 这
可能发生在“map { for(...){...} } ...”和包含“do {
for(...){...} }"。[perl #123286] .
· “scalar()”现在传播左值上下文,所以“for(scalar($#foo)) { ... }”可以
通过 $_ 修改 $#foo。
· “qr/@array(?{block})/”不再因“ARRAY 的奇怪副本”而死亡。 [perl #123344]
.
· 嵌套命名子例程中的“eval '$variable'”有时会查找全局
变量,即使在范围内有一个词法变量。
· 在 perl 5.20.0 中,“sort CORE::fake”,其中 'fake' 不是关键字,
开始砍掉最后 6 个字符并将结果视为排序子名称。
之前将“CORE::fake”视为排序子名称的行为已恢复。
[perl #123410] .
· 在“use utf8”之外,不允许使用单字符 Latin-1 词法变量。 这
它的错误消息“不能使用全局 $foo...”,给出的是垃圾而不是
变量名。
· 不存在的句柄上的“readline”导致“${^LAST_FH}”产生对
未定义的标量(或断言失败)。 现在 "${^LAST_FH}" 最终未定义。
· "(...) x ..." 在 void 上下文中现在将标量上下文应用于左侧参数,
而不是调用当前 sub 的上下文。 [perl #123020]
.
已知的 问题
· 在用 Visual C 6 编译的 perl 上“打包”一个 NaN 行为不正常,导致
测试失败 t/op/infnan.t。 [perl 125203]
· 一个目标是让 Perl 能够重新编译以在任何 Unicode 上运行得相当好
版本。 但是,在 Perl 5.22 中,最早的此类版本是 Unicode 5.1(当前是
7.0)。
· EBCDIC平台
· “cmp”(以及“排序”)运算符不一定给出正确的结果
当两个操作数都是 UTF-EBCDIC 编码的字符串并且存在 ASCII 的混合时
和/或控制字符,以及其他字符。
· 在“tr///”(和“y///”)音译运算符中包含“\N{...}”的范围
与正则表达式模式中的等效范围不同。
他们应该,但不,导致范围内的值都被视为
Unicode 代码点,而不是本机代码点。 (《第 8 版正则表达式》中
perlre 详细说明了它应该如何工作。)
· 编码和编码大多被破坏。
· 许多与核心一起提供的 CPAN 模块显示测试失败。
· “U0”格式的“打包”/“解包”可能无法正常工作。
· 已知以下模块在使用此版本的 Perl 时测试失败。 在
很多情况下,补丁已经提交,所以希望很快会有新版本:
· B::生成版本1.50
· B::Utils 0.25 版
·Coro 6.42版
·舞者版本1.3130
· 数据::别名 1.18 版
· Data::Dump::Streamer 2.38 版
· Data::Util 0.63 版
· 开发::间谍 0.07 版
· 调用器版本 0.34
· 词法::Var 0.009 版
· LWP::ConsoleLogger 版本 0.000018
·梅森2.22版
· NgxQueue 0.02 版本
· Padre 1.00 版
· 解析::关键字 0.08
讣告
布赖恩·麦考利 (Brian McCauley) 于 8 年 2015 月 XNUMX 日去世。他经常在 Usenet、Perl Monks 和
其他 Perl 论坛,并在昵称 NOBULL 下做出了一些 CPAN 贡献,包括
Perl 常见问题解答。 他参加了几乎所有的 YAPC::Europe,并且确实帮助组织了
YAPC::Europe 2006 和 QA Hackathon 2009。他的机智和对复杂系统的喜悦
他对棋盘游戏的热爱尤为明显; 许多 Perl 贩子会喜欢
与布莱恩一起玩 Fluxx 和其他游戏的回忆。 他会被怀念。
致谢
Perl 5.22.0 代表自 Perl 12 和
包含来自 590,000 个作者的 2,400 个文件的大约 94 行更改。
不包括自动生成的文件、文档和发布工具,大约有
对 370,000 个 .pm、.t、.c 和 .h 文件进行了 1,500 行更改。
由于充满活力的用户社区,Perl 继续蓬勃发展到它的第三个十年
和开发商。 已知以下人员贡献了以下改进:
成为 Perl 5.22.0:
Aaron Crane、Abhijit Menon-Sen、Abigail、Alberto Simo~es、Alex Solovey、Alex Vandiver、
Alexandre Ciornii, Alexandre (Midnite) Jousset, Andreas Koenig, Andreas Voegele, Andrew
新鲜,安迪·多尔蒂,安东尼·海丁,亚里士多德·帕加尔齐斯,布赖恩·德·福伊,布赖恩·弗雷泽,
Chad Granum、Chris 'BinGOs' Williams、Craig A. Berry、Dagfinn Ilmari Mannsaaker、Daniel
德拉甘、达林·麦克布莱德、戴夫·罗尔斯基、大卫·戈尔登、大卫·米切尔、大卫·惠勒、德米特里
Tikhonov、Doug Bell、E. Choroba、Ed J、Eric Herman、Chrysostomos 神父、George Greer,
Glenn D. Golden、Graham Knop、H.Merijn Brand、Herbert Breunung、Hugo van der Sanden、James
E Keenan、詹姆斯·麦考伊、詹姆斯·拉斯帕斯、扬·杜波依斯、Jarkko Hietaniemi、Jasmine Ngan、杰瑞
D. Hedden、Jim Cromie、John Goodyear、kafka、Karen Etheridge、Karl Williamson、Kent
Fredric、kmx、Lajos Veres、Leon Timmermans、Lukas Mai、Mathieu Arnold、Matthew Horsfall、
Max Maischein,迈克尔·邦克,尼古拉斯·克拉克,Niels Thykier,Niko Tyni,诺曼·科赫,
奥利维尔·门格、彼得·约翰·阿克拉姆、彼得·马蒂尼、彼得·比萨克斯、菲利普·布鲁哈特 (BooK)、
皮埃尔·博戈西安、拉斐尔·加西亚-苏亚雷斯、兰迪·斯托纳、雷尼·厄本、里卡多·西涅斯、罗伯
霍尔茨、罗斯蒂斯拉夫·斯库德诺夫、索耶 X、白方健太郎、什洛米·菲什、西西弗斯、斯拉文
雷齐克、史迈勒斯、史蒂芬·穆勒、史蒂夫·海、沙利文·贝克、赛伯、塔德乌什·索克斯尼尔兹、托马斯
西布利、托德·里纳尔多、托尼·库克、文森特·皮特、弗拉基米尔·马雷克、雅罗斯拉夫·库兹明、伊夫·奥顿、
AEvar Arnfjoer` Bjarmason。
上面的列表几乎肯定是不完整的,因为它是自动生成的
版本控制历史。 特别是,它不包括(非常
感谢)向 Perl 错误跟踪器报告问题的贡献者。
此版本中包含的许多更改源自包含在
Perl 的核心。 我们感谢整个 CPAN 社区帮助 Perl 蓬勃发展。
有关所有 Perl 历史贡献者的更完整列表,请参阅 作者
Perl 源代码分发中的文件。
报告仪表板 错误
如果你发现你认为是一个错误,你可以查看最近发布到
comp.lang.perl.misc 新闻组和 perl 错误数据库位于. 那里
也可能是信息在http://www.perl.org/>,Perl 主页。
如果您认为您有未报告的错误,请运行随附的 perlbug 程序
你的释放。 确保将您的错误缩减为一个很小但足够的测试用例。 你的错误
报告,连同“perl -V”的输出,将被发送到 [email protected] 成为
由 Perl 移植团队分析。
如果您报告的错误具有安全隐患,因此不适合
发送到公开存档的邮件列表,然后请将其发送至
[email protected]. 这指向关闭订阅未归档邮件
列表,其中包括所有核心提交者,他们将能够帮助评估影响
问题,找出解决方案,并帮助协调补丁的发布
在支持 Perl 的所有平台上缓解或修复问题。 请只
将此地址用于 Perl 核心中的安全问题,而不是单独用于模块
分布在 CPAN 上。
使用 onworks.net 服务在线使用 perl5220delta