在Perl脚本的顶部,可以编写use v5.14
,如果解释器比这更旧,它将退出并显示错误,而不是尝试(徒劳地(执行依赖于尚不存在的功能的脚本。 此外,这允许添加新功能,而不会破坏期望能够使用新关键字作为标识符的旧脚本。 然而,据我所知,这并不能阻止Perl发明新的警告,所以在旧版本中没有警告运行的代码将在新版本中发出它们。 有没有办法要求"请不要新的警告"? 诚然,这样做的上下文是愚蠢的:我想使用 smartmatch 运算符,它被追溯声明为实验性的,我不想输入这个丑陋的东西:
no if $] >= 5.017011, warnings => 'experimental::smartmatch'
编辑:脚注:我实际上正在使用FATAL =>"all",诚然,它有自己的问题,但它保证警告被注意到。幸运的是,这是一个用户脚本(想想 grep 或 diff(,所以有人在那里做点什么
我想使用智能匹配运算符
不要!智能匹配的设计被破坏了,它将以向后不兼容的方式被删除或更改。看到这里。
有没有办法要求"请不要新的警告"?
不。您可以显式指定要获取的警告类别,但这只会阻止新类别,而不会阻止现有类别中的新警告。
实际上不是您要求的,但您可以使用$SIG{__WARN__}
钩子过滤警告。当然,这比这一行的代码要多得多。
我不想打这个丑陋的东西
如果使用 5.18+,则以下内容就足够了:
no warnings qw( experimental::smartmatch );
如果您可能没有 5.18,那么您仍然可以使用
no if $] >= 5.018, warnings => qw( experimental::smartmatch );
使用 Import::Into,您还可以创建模块,仅用一个简单的use
替换以下样板
use strict;
use warnings;
use feature qw( switch );
no if $] >= 5.017011, warnings => qw( experimental::smartmatch );
我不受欢迎的观点是,警告是用于开发和测试,而不是生产。没人看到的警告不是很有用。
您可以关闭警告:
no warnings;
您可以关闭警告类型:
no warnings qw(void);
我的建议只有在您正在做创建测试套件并在部署之前使用它来检查升级的明智事情时才有效。如果您正在升级并希望获得最好的结果,这对您来说并不真正有用,因为警告并不是您可能面临的最大问题。我更担心微妙的行为变化和模块升级。
如果在部署之前未进行测试,请观察日志几天。当您看到不打算修复的警告时,可以禁用它们。但这意味着你正在记录东西,我也注意到人们往往不会这样做:)。