如何在 perl 5.24 中关闭“什么时候是实验性的……”?

grj*_*ash 2 perl

下面的代码是直接从 perldoc.perl.org 上的当前 perlsyn 页面复制的。[我根据需要添加了初始化和声明以使其运行(并且按预期工作),但重点是“when”关键字]

Perl 5.24 抱怨“何时”是实验性的。很公平,但我不想每次使用关键字时都看到这个。

没有警告 qw(experimental::when) 不起作用 - “未知警告类别......”

我也试过“开关”作为类别

有没有另一种方法来抑制这个警告(除了一般禁用警告)?

use v5.14;
for ($var) {
    $abc = 1 when /^abc/;
    $def = 1 when /^def/;
    $xyz = 1 when /^xyz/;
    default { $nothing = 1 }
}
Run Code Online (Sandbox Code Playgroud)

amo*_*mon 7

您可以通过以下方式在没有警告的情况下启用此构造

use experimental 'switch';
Run Code Online (Sandbox Code Playgroud)

或仅通过禁用“实验性”警告类别

no warnings 'experimental::smartmatch';
Run Code Online (Sandbox Code Playgroud)

(请参阅中可用警告类别perldoc warnings完整列表)。

但请注意,智能匹配, givenwhen构造被认为是从根本上被破坏的,并且正在被删除/重新设计。当您在其他 perl 版本上运行该代码时,仅关闭警告就会破坏您的代码。

相反,请更愿意明确地拼出此代码:

for ($var) {
    if    (/^abc/) { $abc = 1 }
    elsif (/^def/) { $def = 1 }
    elsif (/^xyz/) { $xyz = 1 }
    else { $nothing = 1 }
}
Run Code Online (Sandbox Code Playgroud)

是的,它更难看,但它也适用$var于所有 Perl5 版本的所有值。

  • 将警告文本映射到类别可能有点困难。[perldoc perldiag](http://perldoc.perl.org/perldiag.html#when-is-experimental) 使连接更容易找到。 (2认同)
  • @grjash 社区有相当强烈的共识,即当前形式的 smartmatch(以及“when”)已被破坏。`perlsyn` 文档详细介绍了该运算符极其复杂的行为。可维护的代码应该避免这种复杂性,因为它可能是错误的来源。正如文档中关于`when` 的说法:*不要依赖其当前的(错误)实现。* (2认同)

小智 3

given是实验when的一部分smartmatch,因此可以使用以下方法禁用这些警告:

no warnings qw( experimental::smartmatch );
Run Code Online (Sandbox Code Playgroud)