本周p5p 2000/12/03

注释

您可以通过发送空消息到p5p-digest-subscribe@plover.com.订阅此摘要的电子邮件版本。

请将更正和补充发送到simon@cozens.net

测试

我上周没有提到这一点,但Casey Tweten指出,这对于模块作者来说非常重要:回归测试。您写回归测试,对吧?当然,您会。问题是,写回归测试的方式有成千上万种,这使得调试它们并且找出测试失败时真正发生的事情变得非常糟糕。有一个核心模块叫做Test,它为编写测试提供了一个整洁的框架。在perl5-porters上有些关于人们希望核心回归测试使用Test的声音,但相反的观点是,核心测试应该尽可能少受外部干扰 - Test模块可能包含一些核心测试试图测试的结构。如果你的测试之一是是否可以加载模块,那么加载一个模块来帮助你的测试是没有好处的!不过,如果将一些更高级的测试转换为Test接口会很好。(顺便说一句,这是给那些喜欢做这件事的人的一个提示。)

这个真正的结果是Casey的一个补丁,将h2xs生成的标准模块模板转换为使用Test模块,并鼓励(即强迫)模块作者使用它。所以,模块作者,如果你不知道Test.pm,你很快就会知道。

Charnames

这个补丁让我花了一些时间来理解,但现在我已经理解了,我认为它很漂亮。在执行Unicode测试并在没有Unicode编辑器的情况下输入Unicode数据时,我们必须求助于像

    $x =
    "\x{395}\x{3CD}\x{3B1}\x{3B3}\x{3B3}\x{3B5}\x{3BB}\x{3CA}\x{3B1}";

    $x =
    v917.973.945.947.947.949.955.970.945;

或甚至

    $x = 
    "\N{GREEK CAPITAL LETTER EPSILON}\N{GREEK SMALL LETTER UPSILON}...";

这是一个噩梦。

Ilya的解决方案允许您以拉丁语转写的形式输入外语文本。他提供了一个提供俄语转写的模块,因此现在您可以使用Ilya的模块做以下操作

    use Charnames qw(cyrillic);
    $x = "\N{Il'ya Zakharevich}";

,然后Perl会做正确的事情。建议在核心中包含几个用于测试的转写模块,而在CPAN上包含不常用的模块。

然而,在许多非拉丁语中,转写到拉丁字母是最模糊的,通常有几种不同的方法来做这件事;更糟糕的是,映射有时是不可逆的和非一对一的。Ilya的俄语模块很棒,但并不涵盖所有内容。

正则表达式错误

Jarkko一直在UTF8正则表达式领域进行各种实验。这次,他发现

    use utf8; @a=("b" =~ /(.)/)

将导致段错误,这很糟糕。更糟糕的是,这似乎只在64位平台上失败,无论use64bitint的设置如何,这暗示了一些隐藏的假设。最终,它被追踪到sv_utf8_downgrade中的粗心读取;Jarkko说

为什么不同的平台在这个错误上表现出如此不同的行为(核心转储与无核心转储)是一个谜,但如果我必须猜测,我会咕哝一些关于“对齐”的话。

这就是为什么成为配置南瓜是一项如此艰巨的工作。

另一个核心转储来自

    use utf8; "," =~ /([^,]*,)*/

,另一个来自

    use utf8; 
    $x = $^R = 67;
    "foot" =~ /foo(?{ $^R + 12 })((?{ +$x = 12; $^R + 17 })[xy])?/;

,这被追踪到未能保存和恢复括号计数。症状在不同机器上的表现令人困惑。

xsubpp

伊利亚为 xsubpp 生成了一个补丁,允许使用 OUTIN_OUT 关键字;这除了旧的 IN_OUTLISTOUTLIST 关键字之外。

这些有点令人困惑,但以下是我对它们如何工作的理解:在 C 函数中标记为 OUTLIST 的参数,其值将在函数结束时添加到 Perl 的返回值列表中。标记为 IN_OUT 的参数将在 C 函数的开始从 Perl 变量中读取,而在 C 函数结束时 C 变量的值将被放回 Perl 变量中。实际上,IN_OUT 给你一个可以写入的指针,它与一个 Perl 变量“绑定”。[IN_OUTLIST] 做的是同样的事情,但它不是将值写回 Perl 变量,而是将其添加到返回值列表中。

OUT 值被设置为 C 函数的返回值 - 我想是这样。 自己决定。

Perlipc 示例有bug

尼古拉斯·克拉克对 perlipc 文档的状态提出了我称之为“激情洋溢的呼吁”;其中一些示例甚至无法编译,更不用说完成它们声明的功能了。这还揭露了 Net::hostent 的问题,这尤其令人尴尬,因为 Net::hostent 没有回归测试。尼古拉斯清理了 perlipc 的最严重的错误,并提供了基本的回归测试,罗伯特·斯皮尔进行了扩展。正如 Jarkko 指出的,编写一个可移植的测试是棘手的,但任何测试都比没有好……

(嘿,也许有人愿意尝试编写一个程序,从文档中自动提取示例代码并确保它可编译?)

PerlIO 新闻

通过我的神奇水晶球,我发现本周 Perl 仓库有 500 个补丁。当然,其中大部分 - 一共 400 个 - 是开发主线,32 个是 Sarathy 将大量补丁集成到 5.6.1 中,但剩下的 67 个是 Nick 在 PerlIO 分支上努力工作。这应该提醒你,PerlIO 的许多改进都没有太多宣传,很容易忽视那里正在进行的大量工作。

以下是 Nick 关于 PerlIO 进展的评论

-Duseperlio 现在可以在 UNIX 平台上作为 stdio 的替代品工作。截至上周末,它也在 Win32 的“简单”配置中按“之前相同的功能”模式工作。在使 OS/2 保持一致方面取得了一些进展,但尚未成功。(VMS 还没有消息。)

本周的目标是 Win32 上需要的 PERL_IMPLICIT_SYS 方案,这是 fork() 仿真的前提。一旦构建了它,计划用我们自己的版本替换 Win32 上的低级伪 Unix read()

其他工作领域是启用 PerlIO,以便在程序员控制下以 utf8 格式读写文件。

一旦它工作,然后我们将 PerlIO 连接到 Encode - 我们就“完成了”;-)(实际上,现在有些混乱,因为 PerlIO 深深地嵌入核心,而 Encode.pm 是一个外部 XS 模块。)

由于 Nick 将允许程序员控制层访问,我们需要知道层应该做什么,这就是 Nick 的问题:“那么,有人能提醒我我们想解决哪些 Unicode 问题吗?”

简而言之,我们希望能够将 UTF8 编码的文本读取到 UTF8 编码的 SV 中,并具有相同的输出。层的另一个用途将是用于在基于 DOS 的系统上使用 CRLF 转换魔法的其他用途,以及替换源过滤器机制。

可疑的函数名

这导致了一个语法错误

    sub f {}
    $x-f($y);

这是因为 Perl 假设 -f 是一个文件测试操作符,并且想知道它接下来要做什么,旁边有一个没有二元操作符的变量。包括 Jarkko 在内的一些人认为这是愚蠢的;如果我为 sub f 定义一个子例程,Perl 应该知道我正在尝试调用该子例程。

这自然不仅适用于文件测试,还适用于任何看起来像函数的操作符,例如 ys。提出了几种解决方案,例如强迫Perl使用子程序,或禁止使用“保留”名称的子程序。最后,Jarkko为文件测试制作了一个补丁,在上述情况下输出警告 - 我认为ym和其他情况仍然很宽松。整个线程(36条消息)值得一读,这样你就可以了解当语法出错时Perl维护者会做些什么。

可变值子程序

Casey要求更多有用的可变值子程序。目前,你可以这样说

  package Person;
  sub new { bless { name => $name }, shift }
  sub name : lvalue { $_[0]->{name} }

  package main;

  my $p    = Person->new;
  $p->name = "casey";
  print $p->name . "\n";

请注意,在赋值语句的左侧,$p->name实际上是一个返回可变值的调用的方法。酷吧?

Casey提到,他真的很想有一种方法来获取赋值语句的右侧,以便进行类似实现substr的操作。Rick Delaney建议你可以返回一个绑定可变值,但Casey回答说这很慢;另一种选择是另一个全局变量。Piers呼吁一个更快的绑定系统,这很好,但有人需要设计它、编写它并使其优于当前的系统,同时还要完成所有相同的事情。

Yitzchak指出,可变值不仅仅是赋值上下文,并且有一种方法可以获取右值,这可能会在非赋值情况下出现问题。

各种

是的,浮点数是不精确的。我们知道。然而,多亏了Nick Clarke,现在它们的数量少多了。

下周见,我是你谦卑而顺从的仆人,


Simon Cozens

标签

反馈

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