为什么要使用警告;用严格;在Perl中没有默认值?

时间:2011-05-18 19:29:20

标签: perl

我想知道为什么

use warnings;
use strict;

在Perl中不是默认值。每个脚本都需要它们。如果某人(有充分理由)需要禁用它们,则应使用no strict和/或使用某些命令行参数(对于单行)。

是否有太多写得不好的CPAN模块(使用“严重”表示没有use strict)?或者是因为这会破坏生产中的许多代码?我确信有理由,我想知道。

在5.14 IO::File按需自动加载,用这些基本的pragma做这样的事情是不是可能的?

6 个答案:

答案 0 :(得分:51)

这是为了向后兼容。 Perl 4根本没有严格的限制,并且最有可能仍然为Perl 4编写的脚本仍然可以与Perl 5一起使用。制作严格的自动会破坏这些脚本。对于单行而言,情况更糟,其中许多人不愿意声明变量。默认情况下使单行严格会破坏数百万个shell脚本和Makefile。

它无法自动加载,因为它增加了限制,而不是功能。在文件句柄上调用方法时加载IO :: File是一回事。但是,除非代码执行严格禁止的操作,否则激活严格是没有意义的。

如果脚本指定的最低版本为5.11.0或更高版本(例如use 5.012),则为strict is turned on automatically。这不会启用警告,但可能会在将来的版本中添加。此外,如果您在Perl中进行OO编程,您应该知道使用Moose会自动打开该类中的strictwarnings

答案 1 :(得分:17)

如果您使用现代Perl,请说明,您只需启用它即可。 5.12 applies strict except for one-liners.由于向后兼容性,它不能是默认值。

$ cat strict-safe?.pl
use 5.012;
$foo

$ perl strict-safe\?.pl 
Global symbol "$foo" requires explicit package name at strict-safe?.pl line 2.
Execution of strict-safe?.pl aborted due to compilation errors.

答案 2 :(得分:16)

嗯,use strict现在是默认的,等等。

从Perl 5.12.0开始,如果您需要Perl> = 5.12.0的版本,那么您的脚本将启用所有向后不兼容的功能,包括默认情况下的严格。

use 5.12.0;
use warnings;

与:

相同
use strict;
use warnings;
use feature ':5.12';

它没有被更广泛地打开,因为这样做会打破许多人们依赖“正常工作”的剧本。

使用时,Moose还会自动启用严格警告。因此,如果您使用任何基于Moose的Perl OOP,那么您也可以获得免费通行证。

答案 3 :(得分:10)

这是一个哲学问题,而不是“它不会起作用”的问题。

首先,perl一直处于“如果你想要的话你可以做错了”的范式。这就是为什么那里有很多perl仇敌。许多人宁愿这种语言总是迫使你编写好的代码,但很多快速脚本黑客都不愿意。考虑:

perl -e '@a = split(/[,:]/, $_); print $a[1],"\n";'

现在,在@a前添加'my'会很容易,但对于一行,一次性脚本人们不想这样做。

第二,是的,我认为大部分CPAN确实需要重写。

你不喜欢这个答案,我很害怕。

答案 4 :(得分:1)

warningsstrict都将最终成为默认设置(以及一些非默认的Perl 5功能)with Perl 7。预计将在2021年上半年发布(可能在2020年底左右发布)。也许要在5月18日左右纪念这个问题十周年?迟到总比没有好!

答案 5 :(得分:-2)

如果需要,您可以使用common::sense模块:

use utf8;
use strict qw(vars subs);
use feature qw(say state switch);
no warnings;
use warnings qw(FATAL closed threads internal debugging pack
                portable prototype inplace io pipe unpack malloc
                deprecated glob digit printf layer
                reserved taint closure semicolon);
no warnings qw(exec newline unopened);

它减少了内存使用量。