如何在Perl中静音和给定的实验?

zdwk9cvp  于 2023-06-06  发布在  Perl
关注(0)|答案(2)|浏览(436)

我正在将一个旧的工具链迁移到一个新的系统,现在我收到了大量的通知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或脚本?

v8wbuo2f

v8wbuo2f1#

首先,请注意smartmatching will可以以向后不兼容的方式删除或更改。这可能会影响您的given语句。
要使用given + when而不带警告,需要以下内容:

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

# 5.18+
use feature qw( switch );
no warnings qw( experimental::smartmatch );

experimental为这两个语句提供了快捷方式。

use experimental qw( switch );

最后,您会问如何在不更改程序的情况下将其添加到您的程序中(大概也不更改Perl)。那就只剩下猴子键盘了。
我不建议你这么做。编写几个一行程序来自动修复动态重写Perl行为的程序要容易得多。
但如果您想朝这个方向发展,最简单的解决方案可能是编写一个$SIG{__WARN__}处理程序,过滤掉不需要的警告。

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

(Of当然,如果你的程序已经使用了$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
vaqhlq81

vaqhlq812#

no warnings 'experimental';

至少在5.22版本中可以使用。

相关问题