如何在Perl中进行实验时将其静音?

时间:2017-04-12 17:39:22

标签: perl

我正在将旧的工具链迁移到新系统,现在我收到了大量通知given is experimentalwhen is experimental

$ perl -e 'use v5.10; given (12) { when (12) { print "Hello World" }}'
given is experimental at -e line 1.
when is experimental at -e line 1.
Hello World

我希望我的新系统与旧系统完全兼容。我的意思是完全相同的输出。

有没有办法在不触及oneliner和脚本的情况下将这些通知静音?

2 个答案:

答案 0 :(得分:11)

首先,请注意,智能匹配will会以向后不兼容的方式被删除或更改。这可能会影响您的given声明。

要在没有警告的情况下使用given + when,需要以下内容:

use feature qw( switch );
no if $] >= 5.018, warnings => qw( experimental::smartmatch );

experimental为这两个陈述提供了快捷方式。

use experimental qw( switch );

最后,您询问如何在不更改它们的情况下将其添加到您的程序中(并且可能不会更改Perl)。这留下了monkeypatching。

我不推荐它。编写几个单行程序来自动修复程序,以便在运行时重写Perl的行为要容易得多。

但是如果你想朝那个方向前进,那么最简单的解决办法就是编写一个$SIG{__WARN__}处理程序来过滤掉不需要的警告。

$SIG{__WARN__} = sub {
   warn($_[0]) if $_[0] !~ /^(?:given|when) is experimental at /;
};

(当然,如果您的程序已经使用$SIG{__WARN__},那将无效。)

要在不更改程序或单行程序的情况下加载它,您所要做的就是将补丁放在模块中,并告诉Perl按如下方式加载模块:

export PERL5OPT=-MMonkey::SilenceSwitchWarning
$ cat Monkey/SilenceSwitchWarning.pm
package Monkey::SilenceSwitchWarning;

use strict;
use warnings;

$SIG{__WARN__} = sub {
    warn($_[0]) if $_[0] !~ /^(?:given|when) is experimental at /;
};

1;

$ perl -e 'use v5.10; given (12) { when (12) { print "Hello World\n" }}'
given is experimental at -e line 1.
when is experimental at -e line 1.
Hello World

$ export PERL5OPT=-MMonkey::SilenceSwitchWarning

$ perl -e 'use v5.10; given (12) { when (12) { print "Hello World\n" }}'
Hello World

答案 1 :(得分:0)

no warnings 'experimental';

...至少在5.22版中有效。