本周p5p动态 1999/10/24
$^O
STOP
块和损坏的编译器- POD中的空白行
PERL_HEADER
环境变量- Perl发行版中的过时模块
- 增强的
UNIVERSAL::isa
sort
改进glob
区分大小写reftype
函数- 新的
perlthread
手册页 - Win32和
fork()
- 模块打包和提议的
import
命令 cron
守护进程以$SIG{CHLD}
设置为IGNORE
运行进程Time::Local::timelocal
中的日期范围检查- 新的引号字符
- 对于
use utf8
词汇或动态作用域? - cwd的完整路径在
@INC
- 使用Perl编译器的战略决策
- Perl 5 周岁快乐
- 重新审视Unicode字符类
- Sarathy再次说“天哪”
- 各种
注释
很难跟上所有发生的事情。和以前一样,如果您有任何更正或补充,请告诉我。请将它们发送到 [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
环境变量,类似于PERLLIB
或PERL5OPT
,它将包含在执行源文件之前被附加到源文件上的代码。他想要这样做,以便设置一个环境设置,告诉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::Glob
或 File::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
对年份的解析非常糟糕:2070
、170
和 70
都表示 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编译器的战略决策
在我看来,这看起来像是一个糟糕的举动,但大卫·法尔克有如下说法
然后他报告了这些错误。它们看起来很简单,但没有人回复。想到有人可能因为Perl编译器的问题在街头挨饿,这真是太可怕了。
Perl 5 周岁快乐
实际上,真正的生日是在1994年10月17日,但 perlhist
中有一个错误,所以生日祝福是在第18天到达的。(到目前为止还没有人提供补丁。)
重新审视Unicode字符类
上周讨论了使用Unicode属性来定义正则表达式字符类。感兴趣的人也应该考虑阅读Unicode正则表达式指南。
Sarathy再次说“天哪”
各种
大量错误报告、错误修复、非错误报告、问题、答案,以及一小部分垃圾邮件和垃圾信息。
此外,图奥马斯·卢卡继续发送带有不正确 Date:
头部的电子邮件。
下周见,我是您谦卑而顺从的仆人,
标签
反馈
这篇文章有什么问题吗?请通过在 GitHub 上打开问题或拉取请求来帮助我们。