我想知道为什么
use warnings;
use strict;
在Perl中不是默认值。每个脚本都需要它们。如果某人(有充分理由)需要禁用它们,则应使用no strict
和/或使用某些命令行参数(对于单行)。
是否有太多写得不好的CPAN模块(使用“严重”表示没有use strict
)?或者是因为这会破坏生产中的许多代码?我确信有理由,我想知道。
在5.14 IO::File
按需自动加载,用这些基本的pragma做这样的事情是不是可能的?
答案 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会自动打开该类中的strict
和warnings
。
答案 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)
warnings
和strict
都将最终成为默认设置(以及一些非默认的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);
它减少了内存使用量。