本周p5p动态 1999/10/24

注释

很难跟上所有发生的事情。和以前一样,如果您有任何更正或补充,请告诉我。请将它们发送到 [email protected],其中 YYYYMM 是当前年份和月份。

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

$^O

关于 $^O 和相关内容的巨大讨论。这是由Tom引起的,他想编写一个跨检查手册页中 SEE ALSO 部分的程序。问题:Linux的每个版本都有一个与每个其他版本略有不同的 man 命令。特别是,每个系统对页面所在位置及其组织方式有不同的看法。Tom想了解他的程序运行在哪种Linux上,是“Red Hat”还是“Debian”等,但 $^O(以及 uname 命令)只说 linux,这不够。

随后出现了各种讨论。建议1:让 $^O 看起来像 linux-redhat 或类似的东西。反对意见:更改 $^O 将会破坏那些使用 $^O eq 'linux' 而不是 $^O =~ /linux/ 的愚蠢程序。将 redhat 放入 $^O 不会真正解决Tom的问题,至少在一般情况下不会,因为 redhat 的语义从发布到发布会发生变化。

建议2:为发行版供应商添加 Config.pm 字段。反对意见:Config.pm 只反映了构建Perl时的系统状态,而不是程序运行时的状态。可能的解决方案:让 Config 在请求信息时确定运行时的操作系统。第二个反对意见:如果 Config 可以这样做,为什么Tom的程序不能以相同的方式,但不需要 Config 呢?好吧,OK,这种恶劣的东西可以封装在一个模块中。但是Sarathy不喜欢将这种动态信息放入 Config 中的想法。他建议

建议3:一个新的模块 OS,提供查找此类信息的函数。还有其他类似的建议。Dan Sugalski 建议添加一个新的魔法 %^O 变量,其行为类似。Nick Ing-Simmons 建议一个 OS_Info 模块。这种多样性表明我可能是唯一一个跟随整个繁琐讨论的人。(如果这样,那每个人都有很好的判断力。)

哎呀。当我接受这份工作时,我知道偶尔会有一些巨大的但微不足道的讨论。但我没想到会这么快。

如果这个讨论有结论,我没能找到。也许下周会有更新,也许每个人都会对这个整个事情感到厌倦,忘记它。Tom最终放弃了这个问题,他的程序现在假设它运行在Red Hat下。

在这个过程中,我发现了一些有趣的偏离。有关Sarathy在无分叉的Microsoft OS上创建fork()的讨论(更多内容见下文。)Tom Horsley对Configure的批评性言论非常有趣,遗憾的是这里无法全部展示。

实际上,Configure的作用就像是一个充满了各种系统config.h文件的压缩归档,按下按钮只是解压其中一个文件。

问题在于尝试提取从未放入归档的文件时会出现。…

对此的回复也值得一看。

STOP 块和损坏的编译器

perl 5.005_62的一个变化是,在-c模式下,将不再运行END块。Nick Ing-Simmons想知道编译器将如何工作;它以前是通过启用-c模式,遍历操作树,并在END块中输出编译后的代码来工作的,该块在程序文件解析和编译后执行。(这可能是一个错误的描述;在此处纠正我将不胜感激。)在-c模式下禁用END块是正确的,但这会破坏编译器。

在做出这个更改时,Sarathy计划了一个解决方案,如果你感兴趣,可以在perldelta中找到。但这个解决方案会让编译器感到烦恼,Sarathy建议最好的解决方案是STOP块。这些块将在编译阶段之后、运行阶段之前运行;与在运行阶段开始时运行的INIT块相反。通常,这两件事情几乎是同时发生的,STOP块紧接在INIT块之前。但如果你考虑一个编译器模块,在编译阶段暂停,写入编译后的代码并退出,STOP块的有用性就变得明显了。

Vishal Bhatia指出,这将解决现有的编译器bug:目前编译脚本根本不会执行END块。如果B::模块在STOP块而不是END块中完成它们的工作,它们就不必篡夺END块。

POD中的空白行

Larry Virden提交了一个小的文档补丁:有一行看起来是空的,但实际上包含空白。这阻止了POD解析器识别下一行的=head指令,因为只有在它们开始于`段落’时,指令才会被识别,并且只有当一行完全为空时,才会认为它结束了一个段落。

这种令人烦恼的行为最终将被修复。我感到非常高兴,因为我在1995年对此提出了投诉

PERL_HEADER 环境变量

Ed Peschko想要一个新的PERL_HEADER环境变量,类似于PERLLIBPERL5OPT,它将包含在执行源文件之前被附加到源文件上的代码。他想要这样做,以便设置一个环境设置,告诉Perl在编译任何程序的其余部分之前始终加载一些标准、本地定义的模块。

许多人找到了为什么这样做是坏事的说服理由,还有许多人提出了实现它的方法。例如,你可以设置PERL5OPT-MFoo -MBar

Perl发行版中的过时模块

Michael Schwern指出,Perl中分发的几个模块在CPAN上存在更新的版本。

结果,许多情况都是出于好理由。例如,Ilya保持Devel::Peek在CPAN上的版本号高于Perl中的版本号,这样如果你要求CPAN.pm安装Devel::Peek,它就不会去为你安装最新的Perl版本。(为什么它会这样做呢?)

然而,一些模块在分发中的确已经过时。Sarathy要求Perl分发中模块的作者在更新它们时给他发邮件。

增强的 UNIVERSAL::isa

Mark Mielke 提出了增强 isa 的建议,使其能够接收一个对象和多个类名,如果对象属于这些类中的任何一个,则返回 true。目前,只允许一个类。没有得出结论。我的猜测是,这个提议可能不会采纳,因为如果你想要这样的功能,很容易编写这样的函数。

sort 改进

我还不完全理解这一点,但它看起来很有趣。看起来 Peter Haworth 希望Perl在以 ($$) 原型化排序比较函数时能够注意到,并优化此类函数的参数传递以获得 $a-$b 优化的速度,但实际上并不使用 $a$b。然后你可以使用任何两个参数的函数作为排序比较器,但它的速度将和专门使用 $a-$b 方法一样快。我已经询问 Peter 确认这一点,并将下周报告。

备注:10月26日添加:Peter 确认我基本上是正确的,但补充道

这更多是为了去除包的烦恼,而不是为了性能。如果我能正确实现这个补丁,你就可以使用来自不同包的比较器函数,并且它可以直接从 @_ 中获取其参数,而不是 ${caller.'::a'}${caller.'::b'}。此外,Ilya 表示这将允许 XSUBs 作为比较器使用,但我对这方面的历史了解不够充分,不知道为什么它们现在不能使用。

glob 区分大小写

Perl 5.005_62 可选有一个新的内置 glob 函数实现;它不需要调用 shell 来执行 glob。Paul Moore 指出,新的内部 globber 在他的 Win32 系统中是大小写敏感的,即使是在不区分大小写的文件系统中;以前,glob 是不区分大小写的。

关于如何处理,有一些讨论。Sarathy 倾向于让新的 globber 在不区分大小写的文件系统中保持不区分大小写,反之亦然;在 Windows 系统中有一个 API 可以用来查询这一点。他向 Paul 请求一个补丁。他说,如果人们需要特定的语义,可以使用 File::GlobFile::DosGlob 模块。

顺便说一句,[Larry 建议将新的 glob 设置为 Perl 的 beta 测试版本的默认值](http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1999-10/msg01183.html),以便能够得到充分的测试。

reftype 函数

Jeff Pinyan 发布了一篇关于以 (;$) 原型化的函数行为的投诉。他希望 print f arg1, arg2 能够被解析为 print f(arg1), arg2。目前,Perl 报错,抱怨 f 获取了两个参数,但最多只期望一个。Jeff 在编写一个确定其参数是什么类型(数组、哈希等)的函数时遇到了这种行为。

(这比看起来要困难。你不能只使用 ref,因为如果你有一个被命名为 ARRAY 的类祝福的对象,即使对象是哈希,ref 也会返回 ARRAY,并且你还会遇到命名 0 等类似的问题。)

没有人解决 (;$) 问题,但讨论了如何构建这样的函数。Spider Boardman 揭示他已经有一个名为 attributes::reftype 的此类函数,它已经在标准的 Perl 分发中。这是一个用 XS 编写的 C 函数,显然是正确的做法。Sarathy 说他认为 attribute.pm 是放置此函数的好地方。

新的 perlthread 手册页

Dan Sugalski 呈现了一个关于 [《perlthread》手册页草稿](http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1999-10/msg01081.html) 的评论,讨论了 Perl 的线程接口和线程语义。

Win32和 fork()

萨拉蒂一直在努力使 fork 在无 fork 的 Win32 系统上工作。想法是:fork 将创建一个新的线程,运行 Perl 解释器的独立副本,该副本将运行虚构的子进程。子进程将 somehow 有自己的当前工作目录、环境、打开的文件表等等。在 `child’ 线程中的 exec 将终止线程及其相关的解释器,而不是整个进程。

丹·萨加尔斯基:我看出在 5.6 发布之前,VMS 上将会有一些有趣的东西要实现。酷。 :)

模块打包和提议的 import 命令

这周继续。迈克尔·金将他的模块功能分割成 Import::ShortName 用于模块别名,以及 Import::JavaPkg,一次性在单个命名空间中加载大量模块,并具有别名。

在这次讨论的末尾,几个人抱怨说,尽管他们认为他们已经遵循了文档中保留 CPAN 模块列表中命名空间的程序,但似乎没有任何结果,他们的名字从未出现在列表中。安德烈亚斯·科恩承担了这个问题。他正在重写 PAUSE 软件,以处理账目,因为模块列表所有者工作过度,无法手动完成所有工作。

安德烈亚斯要求那些请求被遗忘的人到 10 月底前向模块列表发送提醒,并承诺在 24 小时内列出这些请求。

cron 守护进程以 $SIG{CHLD} 设置为 IGNORE 运行进程

在某些系统上,cron 守护进程有这个错误。(这是一个 cron 的错误,因为 cron 应该知道在运行作业时将信号处理恢复到默认情况;否则,作业将继承这种不寻常的信号环境,可能会得到意外的结果。)

汤姆·费尼克斯向 Linux 提示文件添加了一个补丁来尝试检测此问题,并在 Perl 构建时打印出警告。萨拉蒂说将此放入提示文件不好,因为这实际上 不会 影响构建过程,并且应该更突出地记录。

迈克·盖伊问:“在这种情况下,Perl 自动在启动时设置 $SIG{CHLD} = 'DEFAULT' 不更好吗?在所有情况下这样做会有害处吗?”萨拉蒂表示同意,并添加了一个补丁来实现这一点,并如果这样做,还会发出警告。

Time::Local::timelocal 中的日期范围检查

如果您要求 timelocal 转换一个月中日期大于 31 的日期,它将中断并显示警告

        Day '32' out of range 1..31

约翰·L·艾伦抱怨说,这很愚蠢,原因有两个:首先,当您要求 2 月 30 日时,它不会中断,其次,它阻止您要求 1 月 280 日以找出该年的第 280 天的日期。他提交了一个补丁,消除了检查。

这样的补丁之前已经存在,但萨拉蒂将其移除,因为它在 libwww 中导致测试失败;萨拉蒂希望它根据 nocroak 变量或类似的东西进行条件化,以实现向后兼容。在随后的讨论中,乔纳森·斯科特·达夫列出了一些他希望看到 Time::Local 中的新功能——例如 `fast’ 和 `correct’。

迈克·盖伊说他已经在这方面工作过,但遇到了一些讨厌的向后兼容性问题。例如,当前的 timelocal 在错误时返回 -1。但因为它也指示 1970 年前的有效时间,所以 timelocal 不能在 1970 年之前工作,同时还要与当前版本保持向后兼容。此外,现有的 timelocal 对年份的解析非常糟糕:207017070 都表示 2070 年,这与常识和文档相反。

萨拉蒂表示,如果有一个命令可以启用与旧行为不兼容的改进行为,他将接受 timelocal 的替换。

新的引号字符

克伦·西塔克在 comp.lang.perl.misc 上提问,一旦Unicode支持真正实现,Perl是否能够识别更多类型的括号不是很好吗?例如,U+3010 和 U+3011 是左右 `黑色透镜括号’。q 操作符理解 q{...}q(....) q[...] 以及类似的形式;为什么黑色透镜括号不能呢?

克伦还建议,日语的 `角引号’ 字符 U+300C 和 U+300D (例如)可以用来表示 qr 操作符,就像普通的双引号现在表示 qq 操作符,普通的反引号表示 qx 操作符一样。

伊利亚认为这值得转发到 p5p“一旦Unicode实现,就不能更改匹配规则。因此,至少应该 及早讨论。” 但是没有人对此发表意见。

对于 use utf8 词汇或动态作用域?

目前它是词法作用域的。几周前讨论过是否将其改为动态作用域;这样函数的调用者就可以设置其调用库函数的 utf8 行为。我当时不明白这些问题,所以无法在此重提。

萨拉西请求有见地的人贡献他们的想法,但没有人这么做。

cwd的完整路径在 @INC

埃德·佩什科询问是否可以在 @INC 中包含当前目录的完整路径,而不仅仅是点。常见的反对意见:1. 如果需要,已经有简单的方法将完整路径放入其中:使用 FindBin 模块。2. 对于不需要这种功能的大量用户来说,这将是昂贵的。

使用Perl编译器的战略决策

在我看来,这看起来像是一个糟糕的举动,但大卫·法尔克有如下说法

我是迪奥纳埃亚公司的首席执行官,这是一家设计UNIX性能监控工具的软件公司,我们做出了战略决定,将 perlcc 编译器作为我们代码开发的中心。总的来说,这对我们来说是一个好决定,但我们遇到了几个编译器的问题。

然后他报告了这些错误。它们看起来很简单,但没有人回复。想到有人可能因为Perl编译器的问题在街头挨饿,这真是太可怕了。

Perl 5 周岁快乐

实际上,真正的生日是在1994年10月17日,但 perlhist 中有一个错误,所以生日祝福是在第18天到达的。(到目前为止还没有人提供补丁。)

克里斯·南多提交了一个生日补丁。

重新审视Unicode字符类

上周讨论了使用Unicode属性来定义正则表达式字符类。感兴趣的人也应该考虑阅读Unicode正则表达式指南

Sarathy再次说“天哪”

“哎呀,这个规模就像中国一样大。”

各种

大量错误报告、错误修复、非错误报告、问题、答案,以及一小部分垃圾邮件和垃圾信息。

此外,图奥马斯·卢卡继续发送带有不正确 Date: 头部的电子邮件。

下周见,我是您谦卑而顺从的仆人,


马克-贾森·多米努斯

标签

反馈

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