本周p5p动态 1999/12/12

备注

本报告涵盖了 5.005_63 发布的那一周,因此流量突然激增。现在看来在周日之前赶上似乎不太可能,但我正在接近。

元信息

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

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

5.005_63 发布

Sarathy 的公告 包含了变更列表和 5.005_64 的大量 TODO 列表。

通常在新版本发布后会有一些错误报告,主要涉及编译和配置问题。

Dan Sugalski: 为时已晚,无法添加对 open(RW, "| foo |") 的支持吗?Sarathy: 是的,除非你能说服我那会危及生命。:-)

Tom 也发布了一个待办事项列表,关于源代码中有但未在 perldiag 中记录的消息。

Sarathy 和 Dan Sugalski 关于新线程模型的讨论继续。了解更多。

伊利亚的补丁开发继续

正则表达式优化

Sarathy 为 正则表达式优化补丁 提供的失败案例在伊利亚尝试时并未失败。伊利亚怀疑是版本差异。看起来这个补丁确实已经包含在 5.005_63 中。

PREPARE

Sarathy 和伊利亚讨论了 PREPARE 补丁。不幸的是,我无法立即评估这次讨论。伊利亚提交了一个额外的补丁来修复 Sarathy 提到的“我不知道这怎么能在你那一端工作”的 bug。

PREPARE 未包含在 5.005_63 中。

XSLoader

Sarathy 提供了一个补丁,用于消除使用 DynaLoader.pm 替换 XSLoader.pm 产生的许多警告。XSLoader 相关内容已包含在 5.005_63 中。

xsubpp 的修改

尽管上周收到了有利的测试报告,但 Ilya 的 xsubpp 补丁 没有包含在 5.005_63 中。我并不完全清楚原因。Sarathy 表示补丁不完整且不够健壮,只指出缺少文档以及没有方法禁用更改。伊利亚抗议说有无数个不能禁用的 xsubpp 功能。

补丁位置

Ilya 组装了一些未被 5.005_63 接受的补丁包。了解更多。

新改进的 File::Find

Helmut Jarausch 贡献了一个新的和改进的 File::Find 版本。这里是 Helmut 的原始消息,其中总结了新功能。(或者查看 5.005_63 中的 perldelta。)

DB_File 锁定技术

Paul Marquess 报告说,DB_File 文档中建议的文件锁定策略不起作用。建议如下

    $db = tie(%db, 'DB_File', ...) or die ...;
    $fd = $db->fd;
    open(DB_FH, "+<&=$fd") or die ...;
    flock (DB_FH, LOCK_EX) or die ...;
    ...
    flock(DB_FH, LOCK_UN);
    undef $db;

问题:tie 本身打开文件,导致 stdio 库在文件锁定之前读取和缓存数据库中的某些数据。因此这里存在竞争条件。这种方法也出现在 Camel 和 Ram 的书中。Paul 发表了一条消息,详细描述了这个问题,包括解决方案。其中一种解决方案是简单地锁定一些其他文件而不是数据库文件本身;这也是解决许多类似问题的通用方法。

David Harris 是最初向 Paul 报告这个问题的那个人。他在线上对其进行了详细描述。

随后有一些关于锁定的其他讨论。Raphael Manfredi 发布了他 LockFile::Simple 模块的新版本,该模块提供了简单的 lockunlock 函数以进行咨询式锁定。这并没有出现在 5.005_63 中。

在 XS 模块初始化中使用 use 参数

Ilya 提出了这个问题:他有一个模块,Math::Pari,是动态加载的。他希望能够说

    use Math::Pari qw(:primelimit=1e8 :stack=20e6 :prec=128);

并且让 qw(...) 项影响 Math::Pari 模块的初始化,该初始化是在模块加载时进行的。但是这些项传递给了 import() 函数,该函数在模块加载、启动和初始化后调用,因此太晚了。Joshua Pritikin 提倡的一种可能性是要求用户编写这个:

    use Math::Pari::Init qw(:primelimit=1e8 :stack=20e6 :prec=128);
    use Math::Pari;

Ilya 不喜欢这样。

Larry 建议

    use Math::Pari qw(:primelimit=1e8 :stack=20e6 :prec=128);

可以解释为

    BEGIN {
        local @Math::Pari::ARGV = qw(:primelimit=1e8 :stack=20e6 :prec=128);
        require Math::Pari;
        Math::Pari->import(@Math::Pari::ARGV);
    }

在 XS 调用的 Perl 子程序中使用 next

Gisle Aas 和 Michael A. Chase 报告说,如果您尝试在一个从 XS 程序调用的 Perl 子程序中使用 next,Perl 将崩溃。本周没有关于这个问题的最新消息。

-Dp 的改进

-Dp 选项会打印解析和分词的调试信息。它非常详细,所以您可能只想对感兴趣的代码使用它:

    BEGIN { $^D |= 1 }
    somecode
    END  { $^D &=  ~1 }

以前,这适用于分词,但不适用于解析;Stéphane Payrard 提交了一个补丁,使其也适用于解析。

Log::Agent

Raphael Manfredi 宣布了他的 Log::Agent 模块,该模块允许模块以主应用程序指导的方式发出日志消息。根据嵌入的应用程序的需求,相同的模块可能记录到文件、无地方或到 syslog。

我认为这是一个好主意。让模块保持安静可能非常困难。我上个月的文章中将此作为 Perl 的七宗罪 之一。

它没有出现在 5.005_63 中。

Getopt::Long 文档

Johan Vromans 重写了 Getopt::Long 的文档。

lex_fakebrack 恐怖

上周,Mike Guy 抱怨说,涉及 ${a[0]}${h{k}} 的形式的词法分析不一致。(这些包含在内是为了让 Perl 将 [0-9] 解释为数组索引而不是字符类。)Larry 提供了一个补丁。

Larry:我正在处理这个问题,以防其他人也在考虑它。基本上,lex_fakebrack 需要消失。Ilya:谢谢。在 toke.c 中,并不是很多地方是完全不可理解的,而 lex_fakebrack 就是其中一个。

我想包含相关的代码,以便每个人都能看到 Ilya 认为完全不可理解的是什么。但当然这是不可能的,因为如果它是一小块紧凑的代码,那么它就不会是完全不可理解的。相反,它像一种小但致命的真菌一样遍布 toke.c

dmake 是为 win32 系统设计的 make 版本。Perl 发行版中的 README.win32 文件将人们指引到密歇根大学 Sarathy 的个人目录中的一个源代码副本;Elaine Ashton 询问为什么没有链接到官方网站。Sarathy 解释说官方网站上的副本严重损坏,但他的副本可以正常工作。Elaine 还询问为什么 Sarathy 的版本不在他的 CPAN 目录中;Sarathy 表示,由于它与 Perl 没有直接关系,他不确定是否应该将其放在那里。

Mike Guy 指出,将此类事物放在 CPAN 上并不会设定新的先例,并建议将其放在那里是个好主意。

defined 错误?

Helmut Jarausch 指出:

    print "is defined\n"  if defined($H{'x'}++);

实际上会打印出信息。没有进行讨论,我没有看到补丁。该行为在 5.005_63 中仍然存在。

strict vars 无法检测 $a$b

我本不想提及此事,但 Robin Berjon 建议编制一个最常见的十种非错误报告的列表。我对做这件事很感兴趣。如果人们能提出我应该注意的事项,那将对我很有帮助。上述 strict vars 的非失败就是一个例子,而各种 localtime Y2K非错误也是一些其他例子。如果您有建议,请发送给我。

各种

大量错误报告、错误修复、非错误报告、问题和答案。本周没有垃圾邮件,但有几个人给列表发送了消息询问如何退订,这引发了关于如何避免未来可能出现的此类情况的似乎无果的讨论。

直到下次(可能是周日)再见,我是您谦卑而顺从的仆人,


Mark-Jason Dominus

标签

反馈

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