本周p5p 1999/11/14

这周的流量大致正常,但似乎内容没有往常那么多。也就是说,消息的数量和往常一样,但它们似乎并没有说太多。这可能是我的失误,所以如果你认为我错过了什么重要的内容,请给我发个便条。

你可以通过向 [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 版本的说明,以了解不要做什么。(一盎司先例胜过一磅治疗。)讨论逐渐消失。这可能需要更多的人来工作。

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 月宣布获胜者。

各种

大量错误报告、错误修复、非错误报告、问题、答案,以及少量无意义的内容。(本周没有垃圾邮件。)

下周见,我仍然是你们谦卑的仆人,


Mark-Jason Dominus

标签

反馈

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