Perl警告与特定版本一样?

时间:2017-07-26 15:34:39

标签: perl perl5

在Perl脚本的顶部,可以编写use v5.14,如果解释器比这个更早,它将以错误退出而不是尝试(徒劳)执行依赖于功能的脚本还没有存在。此外,这允许添加新功能,而不会破坏期望能够使用新关键字作为标识符的旧脚本。但是,据我所知,这并不妨碍Perl发明新的警告,因此旧版本中没有警告的代码将以新的方式发出它们。有没有办法要求"没有新的警告请"?对此的背景无疑是愚蠢的:我想使用smartmatch运算符,它被追溯性地宣布为实验性的,我不想输入这个丑陋的东西:

no if $] >= 5.017011, warnings => 'experimental::smartmatch'

编辑:脚注:我实际上使用的是FATAL => '所有'肯定有自己的问题,但它保证警告得到注意。幸运的是,这是一个用户脚本(想想grep或diff),所以有人在那里做点什么

2 个答案:

答案 0 :(得分:2)

  

我想使用smartmatch运算符

不要!智能匹配的设计被破坏,它将以向后不兼容的方式被移除或改变。请参阅this

  

有没有办法要求“请不要发出新警告”?

没有。您可以明确指定要获取的警告类别,但这只会停止新类别,而不会停止现有类别中的新警告。

实际上并不是您提出的问题,但您可以使用$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 );

答案 1 :(得分:0)

我不受欢迎的意见是警告是用于开发和测试,而不是生产。没人看到的警告不是很有用。

您可以关闭警告:

no warnings;

您可以关闭warnings的类型:

no warnings qw(void);

我的建议只有在您创建测试套件并在部署之前使用它来检查升级时才会有效。如果您正在升级并希望获得最佳效果,那么这并不适合您,因为警告不是您可能面临的最大问题。我会更加担心细微的行为变化和模块升级。

如果您在部署之前未进行测试,请查看日志几天。当您看到不会修复的警告时,您可以禁用它们。但这意味着你正在记录东西,我也注意到人们往往不会这样做。 :)