63

我刚刚安装了 Perl 5.18,我收到了很多这样的警告,

given is experimental at .\[...].pl line [...].
when is experimental at .\[...].pl line [...].
Smartmatch is experimental at C:/strawberry/perl/site/lib/[...] line [...].

调查这些警告——我从未听说过在任何地方提到过——我只能在两个地方找到这个,

Perl Delta 仍然最常提及这些功能正在发生的事情。它半埋在吊舱里,

智能匹配,在 v5.10.0 中添加并在 v5.10.1 中进行了重大修改,一直是投诉点。尽管它有很多有用的方式,但它也被证明对于 Perl 的用户和实现者来说是有问题的和令人困惑的。关于如何最好地解决这个问题,已经提出了许多建议。很明显,smartmatch 几乎肯定会在未来改变或消失。不建议依赖其当前行为。现在,当解析器看到 ~~、given 或 when 时,将发出警告。

我很困惑 Perl 在过去 10 年中最重大的变化是如何被取消的。我已经开始在各处使用given,when和。smartmatch有没有关于这些期货的更多信息?怎么会有人觉得它们“令人困惑”?这些特征可能会发生怎样的变化?是否有计划通过模块来实现这些功能?

4

3 回答 3

37

智能匹配的设计存在问题。任何给定TYPE ~~ TYPE应该做什么的决定通常是不明显的、不一致的和/或有争议的。这个想法不是要删除智能匹配;这是修复它。

具体来说,~~将大大简化,正如您在 5.18 pumpking的提案中看到的那样。关于两件事应该如何匹配的决定将由诸如Smart::Match中已经存在的助手来完成。

... ~~ any(...)

它更具可读性,更灵活(完全可扩展),并解决了许多问题(例如“何时应将 X 视为数字,何时应将其视为字符串?”)。

于 2013-06-05T02:25:34.650 回答
21

阅读rjbs 对 smartmatch 提出的更改可能会获得一些见解。毕竟他是 pumpking(Perl 发布经理),所以他的评论和他对未来的看法比大多数人都更重要。也有很多社区对此事发表评论;例如,请参见此处。“实验”状态是有效的,因为未来可能会发生变化,即使我们不知道这些变化会是什么,它也有责任告知用户这一事实。

于 2013-06-05T03:19:07.043 回答
10

嗯,这就是将这组功能降级为实验性的补丁描述中所说的:

given/when/~~ 的行为在 perl 5.20.0 中可能会发生变化:智能匹配将被删除或剥离。鉴于此,应警告使用这些功能的用户。使用这些功能时,应发出“experimental::smartmatch”类别警告。

因此,虽然您确实可以关闭这些警告,但使用如下(来源):

no if $] >= 5.018, warnings => "experimental::smartmatch";

...它只是让你的眼睛从问题上移开。

于 2013-06-04T20:43:27.477 回答