本周p5p 2000/06/25
- 备注
- 方法查找加速
tr///CU
和tr///UC
已移除is_utf8_string
- 字节顺序标记回归
pack("U")
- 词法变量和
eval()
FILEGV
perlhacktut
perlutil.pod
- 缺少方法
- 抑制原型不匹配警告
- 自动加载的常量未内联
lib.pm
use English
IPC::Open3
中的数字打开- 正则表达式错误
Foo 是 Foo 的子类
README.hpux
my __PACKAGE__ $obj
…- asdgasdfasd
- 各种
备注
您可以通过发送空消息到 [email protected]
. 订阅此摘要的电子邮件版本。
请将更正和补充发送到 [email protected]
,其中 YYYYMM
是当前年份和月份。
本周的报告稍微晚了一些,因为我去了圣地亚哥Usenix,然后我去了匹兹堡的YAPC(可能是在这个大陆上唯一一个愚蠢到尝试做两件事的人)然后我回到了费城,并被开车送往华盛顿DC参加派对,然后乘火车回来。
我本想说列表上的一周很安静。但并非如此。这只是一个低流量的一周。一点也不安静;各种有用和有趣的内容都被发布,信号与噪声比异常高。
本周被命名为“Doug MacEachern 和 Simon Cozens”的一周。感谢 Doug 和 Simon,以及本周为异常高的信号与噪声比做出贡献的每个人。
方法查找加速
对上周 Doug 补丁的更多讨论。
上周,一些人指出,如果存在在运行时修改 @ISA
的代码,它将失败;Sarathy 建议一个语法定义,保证不会发生这种情况。Nick 建议使用 use base
可以做到这一点。
Doug 提交了一个更新的补丁。
为了您的欣赏,Simon Cozens 写了一个关于补丁及其工作方式的详细解释,包括许多关于 Perl 内部的细节。如果您对 Perl 内部(您应该这样做)感兴趣,则强烈建议您阅读。
我非常希望在未来运行类似类型的其他文章。这应该被理解为向人们请求他们贡献文章。它们不必像 Simon 的那样完整或详细。
非常感谢,Simon。
tr///CU
和 tr///UC
已移除
一直在处理行纪律特性的 Simon,移除了Larry 已经决定是一个坏主意并且应该被消除的讨厌的 tr///CU
功能。
is_utf8_string
Simon 还添加了一个名为 is_utf8_string
的函数,用于检查一个字符串以确保它是有效的 UTF8。计划是如果 Perl 正在读取一个被认为是 UTF8 的文件,它可以在在最终标量上设置 UTF8 标志之前检查输入。
字节顺序标记回归
Simon 提交了一个改进的补丁。这个补丁只是让词法分析器使用 tell()
来查看假定的字节顺序标记是否位于文件的开始处。
pack("U")
几周前,关于这应该做什么有所讨论。
Simon提交了一个补丁,实现了Larry的一个想法:在包模板开头放置一个U
表示pack
的结果是一个UTF8字符串;其他任何字符表示字节字符串。这意味着(例如)您可以在任何模式的开始处放置U0
来强制它产生UTF8;如果想要以U
开头但结果为字节字符串,请在开头添加一个不执行任何操作的C0
。
词法变量和 eval()
Yitzchak Scott-Thoennes报告了关于这些特性之间相互作用的多个谜题,包括
{ my $x; sub incx { eval '++$x' } }
在这里,incx
似乎增加了词法变量;他期望它增加全局变量。(理由:词法变量应该被优化掉。)
Rick Delaney在clp.misc中的Ilya的相关文章中提到了。
Yitzchak说,子程序中的代码不应能够更改更外层的词法变量,除非它是一个闭包,而这里的incx
不是闭包。Rick提出了以下反例
my $Pseudo_global = 2;
sub double {
my ($x) = @_;
eval '$x * $Pseudo_global';
}
讨论似乎没有结论。没有提供补丁。
我说我之前对此类情况下的Scheme和Common Lisp的行为做了一些研究,并将汇总报告回来,但我还没有这么做。
FILEGV
关于FILEGV
宏有一些讨论。当Perl编译操作树时,行和文件信息存储在GV中。或者更确切地说,曾经是这样;现在,如果您使用ithreads编译,它只是使用字符串。有一些宏,如*FILEGV
,用于访问这个GV,但据Sarathy说,它们主要用于获取文件名,而且有一个更直接的宏家族,如*FILE
,可以直接获取文件名。Doug MacEachern想在B::Graph
中使用原始宏,尽管我不确定原因;Sarathy说,可能是B::Graph
需要修复。
perlhacktut
Simon贡献了名为perlhacktut
的文档的前半部分,这是一篇关于修改Perl核心的教程。它讲述了如何入门以及需要阅读的内容,概述了Perl的庞大子系统,并开始讨论Perl的基本数据类型和操作树。
如果您对Perl内部感兴趣(您应该感兴趣),那么这是一篇强烈推荐的阅读材料。(哎呀,这听起来很熟悉。)
perlutil.pod
Simon还贡献了一份描述与Perl一起打包的实用程序文档,例如perldoc
、pod2html
、roffitall
和a2p
。
Simon这一周非常忙碌。
缺少方法
Martyn Pierce指出,如果您的代码如下
Foo->new('...');
它可能因两个原因而失败:因为Foo
类没有定义那个方法,或者因为您忘记在程序中放置use Foo
。在这两种情况下,信息是
Can't locate object method "new" via package "Foo" ...
Martyn建议在第二种情况下,可以添加一条备注
(perhaps you forgot to load module "Foo"?)
然而,他没有提供补丁。
我也想知道为什么它说“对象方法”,很明显这是一个类方法。我也没有提供补丁。这对于想要开始修补的人来说是一个极好的第一个补丁。如果您对此感兴趣但不知道从何开始,请写信给我。
抑制原型不匹配警告
Doug MacEachern在Socket.pm
中发现了大量只有预先声明一些自动加载的常量(如AF_INET
)的子程序声明。这些声明的唯一目的是防止在运行时实际自动加载常量时出现“原型不匹配”警告。然后,他提出一个补丁来抑制警告,如果看起来子程序将在稍后自动加载,并从Socket.pm
中删除了20K的常量子程序声明。
自动加载的常量未内联
Doug 还发现这些自动加载常量的值没有内联,因为使用它们的代码在子程序加载之前就已经编译了。Doug 为 Exporter.pm
产生了一个补丁,允许你在 use
行中指定一个以 +
符号开头的名称,以指示在模块加载时立即调用子程序(因此自动加载),这样它们就可以内联到后续代码中。
lib.pm
Doug MacEachern 认为很遗憾 lib.pm
必须引入所有的 Config.pm
,因此他将 lib.pm
重新编写为脚本,lib.pm.PL
,在安装时生成真正的 lib.pm
,并内联插入适当的 $CONFIG
变量值。
(目前许多其他工具,如 perlcc
和 pod2html
,都是以这种方式生成的。在源目录中执行 ls */*.PL
以查看列表。)
use English
Barrie Slaymaker 贡献了一个补丁,现在你可以这样写
use English '-no_match_english';
它将导入所有常规标点符号变量的所有长名称,除了 $`
、$&
和 $'
,这些名称会减慢你的正则表达式。如果你不提供此标志,则这些变量将通过 eval
语句单独别名为。
这已经拖了很久了——我以为已经完成了。
有一个与某些不重要的风格问题有关的长期偏离,这个问题本应在私人电子邮件中完成,或者根本不完成。
IPC::Open3
中的数字打开
Frank Tobin 提交了一个补丁,允许 IPC::Open3
的用户请求打开的任何“文件”都是已经打开的文件描述符,这与常规 open
中的 open FH, "<&=3"
的方式类似。
正则表达式错误
Ian Flanigan 发现了一个令人沮丧的正则表达式引擎错误。
Foo 是 Foo 的子类
Johan Vromans 抱怨说
my $r = "Foo";
UNIVERSAL::isa($r, "Foo::");
返回 true。Johan 不喜欢 $r
(它是一个字符串)被报告为类 Foo
的成员。有人指出,手册明确说明可以像类方法一样调用 UNIVERSAL::isa
,以确定一个类是否是另一个类的子类,在这种情况下可以调用为
Foo->isa('Foo')
这本质上与 Johan 的例子相同,并返回 true,因为类 Foo
是(平凡地)其自身的子类。
Johan 说“讨厌”。
README.hpux
Jeff Okamoto 更新了它。
my __PACKAGE__ $obj
…
Doug MacEachern 提交了一个补丁来实现这一点。补丁在截止日期前刚刚到达,在过去的两天里已经有很多关于它的讨论,所以我将推迟讨论它,直到我的下一份报告。
如果你想在此之前查看它,这里就是。
asdgasdfasd
一个以 root 运行的匿名人士提交了一个错误报告(使用 perlbug
),只说了“asdgasdfasd”。Martyn Pearce 回复说这不是错误,而是一个特性。
各种
一大堆错误报告、错误修复、非错误报告、问题、答案以及非常少量和垃圾邮件。但没有严重的争吵。
这是这个月的最后一天,所以我将总结一下:我在 junk
文件夹中填写了 97 条消息,在 misc
文件夹中填写了 311 条消息,在 45 个与特定主题相关的其他文件夹中填写了 329 条消息。
直到你下周,我仍然是,你谦卑而顺从的仆人,
标签
反馈
这篇文章有什么问题吗?请通过在 GitHub 上打开问题或拉取请求来帮助我们。