我正在将旧的工具链迁移到新系统,现在我收到了大量通知given is experimental
或when 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和脚本的情况下将这些通知静音?
答案 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版中有效。