本周在 p5p 1999/11/07
- 备注
glob
区分大小写D'oh::Year
和 Y2K 警告- 线程和正则表达式
- 对
xsubpp
的修改 utf8
需要新的 PumpkingSTOP
块map
和grep
在 void 上下文中Data::Dumper
和Regexp
对象sort
改进- IPv6 和
Socket.pm
- 新的引号字符
system 1, foo
- MacPerl 错误消息
pack t
模板- 新的
perlthread
手册页 - 大文件
localtime
出错- 包含 NUL 的记录分隔符
- Perl 5.6 新特性列表
- 各种
本周的报告提前了一些,因为我得去参加 LISA 会议。
您可以通过发送空消息到 [email protected]
订阅此总结的电子邮件版本。
请将更正和补充发送到 [email protected]
,其中 YYYYMM
是当前年份和月份。
关于在 DOSISH 系统上为某些模式赋予什么含义的讨论继续进行。例如,在常规的 glob()
中,反斜杠是一个转义字符。但你知道 DOSISH 系统上的用户将想要编写 glob('foo\\bar')
来在目录 foo
中查找文件 bar
。Paul 的结论是:在 DOSISH 系统上的 glob 模式中的反斜杠只有在它前面还有一个元字符时才像元字符一样行为;否则它是目录分隔符。
D'oh::Year
和 Y2K 警告
Michael Schwern 认为 Perl 的 Y2K 警告太少而且太晚了。(太少:5.005_62 在你尝试将数字与字符串 "19"
连接时发出警告。太晚:看看!现在是 1999 年 11 月。)他提交了一个名为 D'oh::Year
的模块,暂定名称,它遵循以下策略:它覆盖了 localtime
和 gmtime
函数,以便它们返回一个看起来像数字但实际上是重载对象的年份值。当此对象与任何 "19"
、"20"
或 "200"
字符串或执行其他几个可疑操作时,它会发出警告。它不进行任何核心补丁。它可以从 Michael 的网站 获取,也可能从 CPAN 获取。(这个想法最初由 Andrew Langmead 提出。) 了解更多信息。
Sarathy 说他不会将其包含在标准发行版中,除非它可能是 B::Lint
的一部分。
线程和正则表达式
上周我报告了 Perl 正则表达式在多线程中的问题,但我技术细节搞错了。请忽略它,因为它与现实无关。
实际上我比我想的更了解这个问题,因为它是一个长期存在的问题,它出现在许多地方,而不仅仅是多线程。
基本上,问题是某些正则表达式的属性附着在操作树中的 match
节点,这意味着它们与源代码中匹配操作的词法出现相关联。这意味着什么?这里有一个简单的例子
sub tryme {
my $string = shift;
return unless $string =~ /(.)/;
print "$1";
tryme(substr($s, 1));
print "$1";
}
tryme('abc');
tryme
被调用了三次,每次调用都应有一个独立的模式匹配和独立的反向引用变量。没有理由预期 $1
的值会被函数调用改变,所以你会期望函数中的两个 print
语句每次函数调用时打印相同的内容,从而得到 abccba
。但相反,反向引用变量被附加到正则表达式匹配操作符上,而这个操作符在所有对子例程的调用之间是共享的。这意味着对 tryme
的后续调用会覆盖之前调用中的 $1
,输出结果是 abcccc
。唉。线程问题类似:两个线程可以互相践踏同一匹配操作符的反向引用变量。我几乎两年前就曾抱怨过相关的问题,那时就已经很知名了。
Sarathy 对这个问题如此长时间没有修复表示遗憾。正确的修复方法是将操作节点存储一个偏移量到垫中,该偏移量是每个函数调用实例的私有,不会在相同函数的调用之间或线程之间共享。然后垫将包含指向反向引用变量或什么的指针。
我写信给 MIT 的人们询问他们到底在做什么,但他们没有回复。
对 xsubpp
的修改
Ilya 提交了一个针对 xsubpp
的补丁,这将改变 XSUBs 的返回值语义,使其更高效。它需要广泛测试,因为几乎所有的 XSUBs 都会受到 影响。
utf8
需要新的 Pumpking
Nick Ing-Simmons 没有时间再负责 utf8
。如果你想成为新的 utf8
之王,请给 Sarathy 发邮件。
STOP
块
Sarathy 已经把它们放进去。详细信息可以在之前的报告中找到。
map
和 grep
在 void 上下文中
Simon Cozens 提交了一个补丁,该补丁会在 void 上下文中发出关于 grep
和 map
的警告。Larry 说他不想这么做;他认为将 void 上下文传播到代码块中会更好,这样就会出现常用的 useless use of ... in void context
消息。
Larry: 对于除了其主要用途之外使用操作符的论点,让我想起了古老的论点:你不应该为了除了生育目的之外的其他目的而性行为。有时副作用比最初预期的效果更有趣。
Data::Dumper
和 Regexp
对象
Michael Fowler 提交了一个补丁,使 Data::Dumper
能够在 Regexp
对象上工作。(那些是由 qr//
操作符生成的。)关于这些对象的问题有一些讨论:它们难以识别;它们以奇怪的方式进行字符串化,因此,与其他类型的引用不同,你不能确定通过查看字符串化版本来区分它们;等等。Sarathy 表示他对 Regexp
对象的实现感到不舒服,并认为它们应该更类似于普通对象,这样它们就会更容易理解,并且可以像其他对象一样处理。Larry 同意,并补充说异常和文件句柄也应该以这种方式工作。然而,没有具体的建议说明应该做什么。
sort
改进
Peter Haworth 改进了他的补丁,允许 XSUBs 被用作排序比较函数。如果比较器以 ($$)
进行原型化,则将列表元素正常地传递,在 @_
中,而不是作为 $a
和 $b
。请阅读有关内容。
IPv6 和 Socket.pm
Warren Matthews 有一个包含整数和 IPv6 地址(通常表示为 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
)之间相互转换函数的 Socket.xs
版本。他询问是否有人有兴趣将其添加到标准分发中,但没有回复,所以我想可能没有人感兴趣。
新的引号字符
拉里建议,当Perl启用Unicode时,它可以从Unicode字符数据库中推断出哪些字符是括号,然后从字符名称中确定任何给定开括号对应的闭合括号。完成这些后,它可以理解所有类型的括号在q
和qq
运算符中作为分隔符。例如,和是藏文左花括号和藏文右花括号字符。拉里说,括号应该做人们期望的事情,人们期望它们匹配。
或者,人们可以声明他们的括号字符,然后使用U+261E 和U+261C 作为括号。
拉里:沿着这条路走下去,会充满欢乐。
system 1, foo
显然,在大多数非Unix Perl系统中,如果你调用system 1, foo
,它将在后台运行foo
,并返回进程ID号而不是foo
的退出状态。伊利亚建议在Unix上也实现这个功能。
萨拉蒂说,最好有一个模块化接口来提供该功能,他不想将这种漏洞传播到更多系统。“这个概念是可移植的,但咒语不是。它需要一些Perl代码来使之平滑。”
詹达·克里尼基指出,他上周提出的对Shell.pm
的改进可以很容易地扩展以支持这个功能。以防你忘记了。
MacPerl 错误消息
MacPerl曾经像这样格式化错误信息
# Syntax Error
File "script.plx"; Line 46
而不是像这样
Syntax error in script.plx, line 46
因为某些Mac编程工具可以解析另一种形式并自动打开文件,同时突出显示适当的行。马蒂亚斯·尼尔阿赫同意撤销这个更改;我并不完全清楚为什么,并且找不到原始补丁。
pack t
模板
关于伊利亚提出的t
模板用于pack
和unpack
函数的更多讨论。
上周约书亚·普里蒂金问为什么不用Storable
;伊利亚指出,在不同的情况下,不同类型的序列化代码是很有用的,而Storable
并不适用于,例如,你试图将数据序列化以作为命令的参数。然而,你可以使用他的新pack
模板将数据序列化为字符串,将其作为命令参数传递,然后在另一端使用unpack 't'
进行解包。伊利亚对pack 't'
的用处的解释。
新的 perlthread
手册页
大文件
克里斯托弗·马斯特报告说,stat
函数在文件大小超过2GB时无法正常工作,因为大小存储在通常的32位有符号整数中。亚尔科说,5.6(以及当前的开发版本)将对此有更好的支持,但你必须在编译时启用该支持。
localtime
出错
有人提交了另一个错误报告,因为localtime
返回了错误的月份。
包含 NUL 的记录分隔符
萨拉蒂提交了一个补丁,使得$/
可以包含NUL字符,即"\0"
。这可能会无声无息地通过,除非杰夫·平延跟进了关于将$/
设置为\0
(即常量整数零的引用)的问题,并说这是同一主题,尽管它不是。由于太多人对此感到困惑,讨论的时间比应有的时间长了近一倍,有些人讨论了"\0"
,而另一些人则讨论了\0
。无论如何,答案是,只有当$/
是一个指向正数的引用时,Perl才会进入固定长度记录模式。
汤姆:(固定长度记录模式是)另一个需要“顺便说一下”的文档中的特殊案例异常。
丹·苏加尔斯基:是的,但如果我们把它们都拿掉,我们就会剩下37页的文档和C语言中具有变形标量的C。
然后出现了一个插曲:Nat Torknigton建议如果将$/
设置为代码引用,Perl可以在进行<...>
读取时执行代码,并返回代码的返回值,而不是执行它通常会执行的操作。Nat的例子是:
# all filehandles now autochomp
$/ = sub { my $x = CORE::readline(shift); chomp $x; return $x };
(他说的是$\
而不是$/
,但那是一个错误。)
有几个人对此非常兴奋,但Sarathy指出,直接覆盖CORE::GLOBAL::readline()
会更简单,而且他不想提供超过一种来做几乎没有人想要做的事情。
但Larry进一步扩展了这个基本想法,说应该有一个通用、轻量级的方法将各种读写规范插入到I/O流中。这个功能最重要的用途将涉及I/O操作符透明地将UTF-8转换为民族字符集,反之亦然。Larry:“这是我们必须在Perl中使其变得简单的事情。不仅仅是可能的。”
Perl 5.6 新特性列表
Jeff Okamoto问是否有一个。没有人说“是”,所以答案可能是“不是”。
嗯,我突然想到,我现在是编写这样一个5.7及以上版本列表的合适人选。但我没有及早开始这项工作,以至于无法为5.6做这件事。如果人们愿意把他们的功能列表发给我,我会整理它们,并查看perldelta
,尝试得出一个标准列表。
各种
大量错误报告、错误修复、非错误报告、问题、答案以及一些微不足道的热闹。(这周没有垃圾邮件。)
下周见,我谦卑而顺从的仆人,
标签
反馈
这篇文章有什么问题吗?请通过在GitHub上打开问题或拉取请求来帮助我们。