本周p5p 1999/11/14
- 注释
- 词法变量和
eval
- 关于行管理的更多内容
link
在WinNT上- 正则表达式优化
- Solaris上的线程
- 正则表达式引擎的递归性
- 大文件继续
Regexp
对象再次- EBCDIC机器上的Unicode支持
- Marshalling模块
- 你有Perl吗?
localtime()
另一个错误!- 各种
这周的流量大致正常,但似乎内容没有往常那么多。也就是说,消息的数量和往常一样,但它们似乎并没有说太多。这可能是我的失误,所以如果你认为我错过了什么重要的内容,请给我发个便条。
你可以通过向 [email protected]
. 发送空消息来订阅此摘要的电子邮件版本。
请将更正和补充发送到 [email protected]
,其中 YYYYMM
是当前年份和月份。
Ilya 转发了一篇由 Kragen Sitaker 发布在 comp.lang.perl.misc
的文章。文章指出以下代码令人惊讶
$foo = 1; $^W = 1;
sub test1 {my $foo = 2; return sub { eval shift } }
print test1()->('$foo');
子程序捕获了一个词法作用域,其中 $foo=2
;另一方面,参数在一个词法作用域中被评估,该作用域中的 $foo=1
。打印哪个 $foo
的值?答案:都不是。 Ilya 写信给 p5p 建议这种差异应生成警告。 但没有讨论。
我尝试进行一些研究,以了解其他语言如何处理这个问题。(一盎司先例胜过一磅治疗。)我在 Lisp 世界里四处看了看。大多数 Lisp 没有词法作用域的变量。一个主要的例外是 Scheme 系列。在修订版 5 之前,Scheme 没有代码 eval
。修订版 5 有 eval
,但你必须明确指定代码要评估的环境。结论:我们可能是在未经探索的土地上。
关于行管理的更多内容
上周 Larry 说应该有一种方法可以在 I/O 流上注册 I/O 管理器,以便(例如)I/O 操作符可以自动将国家字符集转换为 UTF-8,反之亦然。Sam Tregar 似乎愿意承担这项工作,但它是一个庞大的项目,至今没有消息。Ilya 提醒每个人查看 有关该功能的 Tcl 版本的说明,以了解不要做什么。(一盎司先例胜过一磅治疗。)讨论逐渐消失。这可能需要更多的人来工作。
link
在WinNT上
Jan Dubois 提交了一个补丁,以使 Perl 的 link()
函数能够在 WinNT 下工作。它是通过一些等效的底层 WinNT 功能实现的。
正则表达式优化
Ilya 向正则表达式引擎发布了一个非常大的补丁,其中包含 一个相当重大的优化。
伊利亚的例子是/\bt.{0,10}br/
。通常,Perl可以在正则表达式中查找一个较长的固定字符串,在这个例子中是br
。然后它会在目标字符串中查找br
,因为没有br
就无法匹配。它知道如果找到了匹配项,那么br
将出现在匹配字符串的位置1到11之间;t
必须出现在位置0。Perl会在目标字符串中搜索br
,当找到它时,它会回溯以查找t
。如果没有找到t
,它会重新开始并查找另一个br
。因为这个过程只涉及简单地扫描目标字符串中的固定子串,所以非常快。
假设Perl找到了t
。在优化之前,它会进入正则表达式引擎并开始正常匹配,寻找单词边界。在新优化中,它可以注意到没有单词边界,并立即放弃匹配,而不启动正则表达式引擎的主要部分。
Solaris上的线程
Marek Rouchal报告说,在Solaris下,线程程序并不总是能够正常工作。不清楚问题是什么,或者这是否是Marek、Perl、Solaris线程库或这些组合中的某个问题的责任。这个问题似乎在这个报告中被视为未解决的。
正则表达式引擎的递归性
Stéphane Payrard报告说,如果你在(?{...})
表达式中尝试进行正则表达式匹配,Perl会崩溃。鉴于正则表达式引擎不是可重入的(它使用几个全局变量),这并不令人惊讶。
Hugo van der Sanden:使正则表达式引擎可重入应该可以解决这个问题。Jarkko Hietaniemi:这就像说,“停止战争应该会带来世界和平。”
Stéphane建议在此期间将其设置为致命错误,但没有人提供补丁。
在讨论中,耶稣·基罗加提到他正在为perlre.pod
开发一个替代方案,包括教程和一些示例。这是时候了!
大文件继续
上周Jarkko提到,5.6将更好地支持大文件。(与大于2GB的文件相关联存在32位整数溢出问题。)随后展开了一场非常长的讨论,似乎几乎没有实际内容。如果我对这一点有误,也许有人会给我发邮件总结重要要点?
以下是一些典型问题:你有一个大于2GB的文件,并尝试使用seek()
获取文件指针位置。结果可能太大,无法适应32位整数。你系统的off_t
类型可能足以容纳偏移量值;但是当这个值存储到Perl的SV结构中时,它会强制转换为32位,并且会丢失信息。因此,为了正确处理这个问题,SV需要使用64位整数。但是如果你更改了SV中的整数大小,那么Perl就不再与具有不同大小SV的编译XS模块二进制兼容。当整数值的算术运算溢出整数时,它会被转换为浮点数;但在一个整数比浮点数更精确的系统会发生什么呢?
Jarkko说,在5.005_63中,他会尝试启用对大文件的支持,而不普遍启用64位整数,看看会发生什么。一个困难:很难测试这种支持。
Sarathy建议将文件偏移量存储到浮点变量中。浮点数是不精确的,但只有当你溢出尾数时才会如此,而典型(64位)double
变量的尾数是一个53位的整数。
Regexp
对象再次
关于如何使Regexp
对象更像真实对象的更多讨论,但又不使它们变慢。仍然没有结论,但讨论转移到了重载赋值操作符的主题。
EBCDIC机器上的Unicode支持
在 EBCDIC 机器上的人在使用 Unicode 时会遇到一个不寻常的问题,因为 Unicode 是为与 ASCII 兼容而设计的;前 128 个 Unicode 字符与它们的 ASCII 对应字符相同。例如,在双引号字符串中,\N{EXCLAMATION MARK}
应该生成一个感叹号。实际上,它生成 Unicode 字符 U+0021,在 UTF-8 编码中表示为单个字符 0x21,这恰好是一个 ASCII 感叹号。然而,在 EBCDIC 中,0x21 是大写字母 O。(我想是这样的。)
由于类似的问题,所有 UTF-8 测试在 EBCDIC 系统上都会失败。我认为 Jarkko 的建议是修复 charnames
前缀,以便在 EBCDIC 系统上能够检测到,但问题可能还没有完全解决。
Marshalling模块
David Muir Sharnoff 发来了一条有趣的消息,抄送到了 Modules 列表。其中之一是呼吁为 marshalling 模块制定一个标准接口。了解详情。
你有Perl吗?
Banana Republic 有一则新广告,展示了一头戴着围巾的 llama。 这里我们看到 llama 还戴着 Larry 的胡须。
localtime()
另一个错误!
在 localtime()
中的 Y2K 错误再次被报告。
我邀请每个人猜测在 2000 年将有多少虚假的 localtime()
错误被报告。 注册你的猜测,我将在 2001 年 1 月宣布获胜者。
各种
大量错误报告、错误修复、非错误报告、问题、答案,以及少量无意义的内容。(本周没有垃圾邮件。)
下周见,我仍然是你们谦卑的仆人,
标签
反馈
这篇文章有什么问题吗?请在 GitHub 上打开一个问题或拉取请求来帮助我们。