我正在将旧的工具链迁移到新系统,现在我收到了大量的通知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
Run Code Online (Sandbox Code Playgroud)
我希望我的新系统与旧系统完全兼容.我的意思是完全相同的输出.
有没有办法在不触及oneliner和脚本的情况下将这些通知静音?
ike*_*ami 14
首先,请注意,智能匹配将以向后不兼容的方式删除或更改.这可能会影响您的given陈述.
要在没有警告的情况下使用given+ when,需要以下内容:
use feature qw( switch );
no if $] >= 5.018, warnings => qw( experimental::smartmatch );
Run Code Online (Sandbox Code Playgroud)
实验为这两个陈述提供了捷径.
use experimental qw( switch );
Run Code Online (Sandbox Code Playgroud)
最后,您询问如何在不更改它们的情况下将其添加到您的程序中(并且可能不会更改Perl).这留下了monkeypatching.
我不推荐它.编写几个单行程序来自动修复程序,以便在运行时重写Perl的行为要容易得多.
但是如果你想朝那个方向前进,那么最简单的解决方案就是编写一个$SIG{__WARN__}过滤掉不需要的警告的处理程序.
$SIG{__WARN__} = sub {
warn($_[0]) if $_[0] !~ /^(?:given|when) is experimental at /;
};
Run Code Online (Sandbox Code Playgroud)
(当然,如果您的程序$SIG{__WARN__}已经使用,那将无效.)
要在不更改程序或单行程序的情况下加载它,您只需将补丁放在模块中,并告诉Perl加载模块,如下所示:
export PERL5OPT=-MMonkey::SilenceSwitchWarning
Run Code Online (Sandbox Code Playgroud)
$ 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2923 次 |
| 最近记录: |