本周p5p 2000/05/21要闻

注释

您可以通过向 [email protected] 发送空消息来订阅此摘要的电子邮件版本。

请将更正和补充发送到 [email protected],其中 YYYYMM 是当前年份和月份。

my $x if 0; 小技巧

本周的主要话题(81条消息)不幸地以“perlbug是否损坏”为标题,因为Ben Tilly最初发送给perlbug的消息被退回,他使用这个新主题重新发送。主题应该是“不适当的持久性词法”。

原始问题涉及以下示例

        use strict;
        &persistent_lex() foreach 1..5;



        sub persistent_lex {
            my @array = () if 0;
            push @array, "x";
            print @array, "\n";
        }

这里数组的行为就像一个静态变量,每次调用persistent_lex时不会重新创建;它每次都会积累更多的x。许多人说这是一个特性,如果你理解实现,它的行为是明显的。提出了许多解释,但大多数都是错误的。我认为Nat Torkington的解释是正确的;早期的回应者并不正确。

明显的解释是:my 创建一个词法变量,然后在运行时,每次进入块时都会初始化它;if 0 抑制运行时初始化,以便变量保留其值。为了了解为什么这不是一个充分的解释,请考虑以下示例,它创建了两个闭包

        use strict;
        my $a =  make_persistent_lex();
        $a->()  foreach 1..5;
        my $b =  make_persistent_lex();
        $b->()  foreach 1..5;



        sub make_persistent_lex {
            return sub {
              my @array if 0;
              push @array, "x";
              print @array, "\n";
            };
        }

这里变量 @array 在两个闭包之间是 共享的。如果你省略 if 0;,则 $a$b 会得到不同的变量。

Nat Torkington 提供了我认为是正确的解释,Jan Dubois 补充了一些技术细节。Jan 对内部结构的描述。

有些人建议记录这个“特性”。Tom 说,Larry 告诉他不要这么做,因为他不希望支持它。Larry 赞同这一点

Jan Dubois: 我认为这种行为是实现的副作用,不应作为特性记录。它最多只能是“未定义的行为”,可能在未来发生变化(据我所知)。

Larry: 在 Ada 术语中,使用此功能将被视为错误。

Simon Cozens 后来告诉我,如果 p5p 不能理解“特性”,则不应将其记录为特性。我认为这一点是正确的。Barrie Slaymaker 建议 Perl 在此情况下发出警告。

该线程还包含了一个关于 5.6.0 是否稳定和可靠的讨论。

格式中的零填充数字

John Peacock 提供了一个补丁,允许您指定格式中显示的数字可以进行零填充。(还记得格式吗?您可以使用 write 函数打印格式化的报告。)了解更多信息。

Tom 询问为什么不用 sprintf。John 回复说,对 format 代码的补丁很简单,而 sprintf 解决方案需要比使用零填充格式图像更多的 Perl 代码。

Matt Sergeant 询问为什么格式没有被分离成外部模块。Damian Conway 显然有一篇关于这个主题的论文。Dan Sugalski 回复说,它们可能需要访问解析器。我怀疑真正的原因是没有人真的非常关心。Dan 还补充说,格式需要彻底翻新。

丹·苏加尔斯基:格式确实需要彻底更新——一个页脚功能会很好,能够使用词法变量也同样重要。在这两者之间,以及为提高速度而重新编写BigInt和BigFloat,将使您能够抓住大量的Cobol Cattle Crowd...

禁止声明的语句

我指出,如果您遇到错误

        In string, @X::Y must now be written as \@X::Y...

您不能像手册建议的那样通过声明带有our的数组来修复它,因为对our存在任意限制。我提供了一个补丁来移除这个限制,但我预计它不会被采用,因为几个月前故意设置了这个任意限制。

汤姆回答说

        { package X; our @Y; }

这将工作。

Windows/CE移植

贾尔科·海塔尼米转发了一篇Ned Konz在comp.lang.perl.moderated上发布的文章,说他在为Windows/CE移植Perl,据我所知,这是在掌上电脑上运行的Windows版本。Ned提到了他预见到的许多潜在问题。Ned的文章

西蒙·科兹恩斯向他提到了“microperl”,他说这是为了将Perl移植到小型操作系统而创建的。

西蒙:它确实移除了很多Unix特性,并且将核心大小缩减到最基本的部分。我会从这里开始。

纳特·托金顿顺便提了一句,Windows/CE的移植可能有助于使Palm Pilot的移植成为可能,西蒙抗议说,他可能“在接下来的几周内”就能准备好。他说,最难的问题是让词法分析器适应Palm的小代码段。

chat2.pl 仍在那里

彼得·斯科特在FAQ中提到了chat2.pl,原始作者兰达尔·施瓦茨回复说,它可能从一开始就不应该被包括在内;他多年前为了特定目的编写了它,在comp.lang.perl上发布了几次,以回应似乎想做类似事情的人,而拉里将其包含在Perl 4发行版中,而没有询问他是否同意。兰达尔表示,如果他打算发布它,他会以不同的方式编写它,这就是为什么它从未真正完整。他还说,他对它被从发行版中删除感到高兴。然后他发现它没有被删除,这似乎让他很震惊。

总结:不要使用chat2.pl

pod2latex

蒂姆·詹内斯建议用他基于POD::LaTeX的新版本替换旧的pod2latex。没有进行讨论。

了解更多信息。

长正则表达式

迈克尔·希尔兹演示了一个示例电子邮件消息,该消息使Mail::Header模块解析头信息的时间异常长。然后他提供了一个补丁,这是由罗纳德·金巴尔提出的,它使相关的正则表达式更快地完成。罗纳尔的原始建议并不完全正确;他后来提供了一个第二替代方案。)

迈克·盖伊指出,即使没有补丁,正则表达式在5.6.0版本下也很快完成,因为正则表达式优化更好。然而,伊利亚表示,这个特定的优化是有缺陷的:它只在某些情况下起作用,他没有实现对这些情况的检查。但他无法创建一个测试用例,以显示优化失败。他请求帮助进行这项测试。

伊利亚对测试用例的请求。

本·蒂利和伊利亚就所需的下一个字符预览优化进行了长时间的极其有趣的讨论,这是对任何对正则表达式引擎的内部感兴趣的人或将来可能想成为正则表达式引擎泵王的人的必读内容。

这次讨论的根源。

有一个旁白:约翰·麦克唐纳建议可能有一个标准模块,可以提供针对常见情况的效率高、正确的正则表达式,例如匹配包含平衡括号的字符串。达米安·康威指出,他的Text::Balanced模块正是这样做的。

UTF8散列键

M.J.T. Guy 询问关于 UTF8 哈希键的意图。Nick Ing-Simmons 回应说,他记得它们将按哈希启用,每个哈希要么全部使用 UTF8 键,要么不使用 UTF8 键。Andreas 指出,过去对此已有广泛讨论。

广泛讨论

UTF8字符串补丁

Simon 发现单引号字符串没有正确处理 UTF8-特性,并提供了一个补丁。简要总结:SV 有一个 UTF8 标志,如果您从 UTF8 SV 中提取 C 字符串部分并创建一个具有相同字符串的新 SV,您还必须在新 SV 上设置 UTF8 标志,否则 Perl 不会以相同的方式处理它。Simon 还提供了一个补丁到 perlguts,讨论了这个问题。

mktables.pl 已被解决

James Bence 答应 Larry 的要求,对 mktables.pl 进行翻新。

早期摘要

更多环境问题

Jonathan Leffler 在 DBI 邮件列表上转发了一个与 Perl 使用环境方式相关的问题;如果其他库 尝试修改环境,这会破坏 Perl 并可能导致核心转储。Jonathan 转发了一个关于此问题 1997 年的一些讨论的存档,我记得去年 11 月也出现了这个问题。

Jonathan 的信息。

11 月讨论的摘要。

提出了各种类型的多种解决方案。

readonly 祈祷语句

Mark Summerfield 想要创建一个名为 readonly 的祈使句,它声明一个只读标量变量。这与 use constant 所做的不同,因为由 use constant 生成的“常量”具有特殊的语法,这并不总是有效。例如

        use constant PI => 3;
        $hash{PI} = 'pi';

关键是 PI,而不是 3。还提出了几个替代建议;似乎更好的是 William Setzer 的 Const 模块,它是一个小小的 XS,仅设置 SV 中的 READONLY 标志。遗憾的是,它似乎不在 CPAN 上。Tom 发布了整个代码,这段代码只有几段。

Const.pm

教程

Ken Rietz 提出编写更多教程或协调编写教程,并要求提出建议。如果您想提出建议,请查看此信息。

Brad Appleton 回应了我关于 Pod::Parser 的评论

两周前,我发布了很多关于 Pod 和 Pod 翻译软件的内容,而 Pod::Parser 的作者 Brad Appleton 认为其中一些是不公正的,并且还指出了我犯的许多实际错误。Brad 很好心地提供了一篇纠正我错误的文章。

Brad 的回复。

各种

        p5p: B+++(--) F+ Q+++ A+++ F+ S+ J++ L+

下周之前,我仍然是,您谦卑而顺从的仆人,


Mark-Jason Dominus

标签

反馈

这篇文章有什么问题吗?请通过在 GitHub 上打开问题或拉取请求来帮助我们。