当已经使用了严格模式,是否需要使用警告?

8
代码如下:
use strict;
use warnings;

这里需要使用use warnings;吗?

我已经看到这种情况太多次了。我的新回应将是:http://joelslinux.blogspot.com/2011/06/use-strict-and-warnings.html - Joel Berger
2
老实说,我很惊讶社区会认为这个问题如此重要,以至于投票数这么高。因为在 http://stackoverflow.com/search?q=%5Bperl%5D+strict+warnings 上可以看到,这个问题已经被讨论过多次了。 - Joel Berger
6个回答

8

是的,这是必要的。

use strictuse warnings有不同的作用。

strict模块的手册中可以看到:

strict − 用于限制不安全构造的Perl编译指示

perlrun(对于-w)中可以看到:

打印关于可疑构造的警告,例如仅被提及一次的变量名称、在设置之前使用的标量变量、重新定义的子例程、对未定义文件句柄或只读打开的文件句柄的引用,您正在尝试进行写操作、被用作数字但看起来不像数字的值、将数组用作标量、如果您的子例程递归超过100个深度以及无数其他事情。


1
有没有示例显示 use warnings 做了其他的事情? - new_perl
1
你应该引用 perldiagperllexwarn 来替代 perlrun 的 -w 选项,以便在使用 use warnings 时更加准确。 - daxim
@daxim 的确是有用的参考资料,但没有像我从 perlrun 中引用的那样简洁的摘要。 - Alnitak

5

是的。strict只针对很少的问题进行严格检查。而warnings则警告您可能会遇到的更广泛的问题。


5

3

是的,请考虑以下内容:

perl -le "use strict; my $f; my $z = $f*1"

使用strict模式,函数$f未定义时不会报错;而启用警告则会:

perl -le "use strict; use warnings; my $f; my $z = $f*1"
Use of uninitialized value $f in multiplication (*) at -e line 1.

因此建议同时启用两者。

在 Perl v5.8.8 下,我没有收到“在 -e 行 1 处使用未初始化的值 $f 进行乘法 (*)”的错误提示。 - new_perl
你确定吗?我在5.8.8和5.10.1上测试过了,两者都给出了相同的错误信息。也许你有一个修改过的Perl版本?或者你忘记使用use warnings;了。 - Htbaa
如果你看到了 @new_perl 这个错误提示,那么你的 Perl 安装肯定出了问题。(我记得 5.8.8 版本的警告信息里没有提到 $f,但是它确实会发出警告。) - ikegami

2
“不是必需的”并非字面意义上的必需。也就是说,程序运行时不需要它。人们经常忘记“必需”的含义。
然而,如果你的问题是“严格模式是否启用警告?”,答案是否。你可以通过阅读其文档来了解严格模式的作用。 警告通常有助于指出需要修复的问题。但是,Perl的警告并不要求你修复它们,因此即使程序发出警告,它仍然可以继续运行。
有些人会告诉你始终使用警告,但他们制定这种规则只是为了不必考虑或向那些不会思考的人解释它。除了“始终使用警告”,其他任何观点都不受欢迎。 警告是开发人员的工具,如果看到警告的人不知道它们是什么或该怎么处理它们,那么它们可能只会引起恼怒或困惑。我见过一些新的Perl版本开始为程序发出新的警告,然后由于没有人监视日志文件,磁盘被填满了。
我有一个更加细致的规则:“当你会采取措施时使用警告,否则不要使用它们。”
我甚至不会说“总是编写无警告代码”。我写的很多代码只运行一次,或者从命令行运行,或在其他我不关心粗糙程度的情况下运行。我不喜欢给别人提供有警告的代码,但对于我自己做的小事情,我不会过分纠结。

对那些观点不同的人进行严厉的负面评价是不必要的。在我的情况下,答案基于将问题解释为意味着“use warningsuse strict的子集吗?”即是否use strict完全取代了需要使用use warnings - Alnitak

1

“必要”是我的回答。

如果你认为strictwarnings是一样的,那么你就错了。其他人已经给出了关于每个编译指示的很好的答案。

use warnings通常会让你成为一个更好的编码者。如果学习很重要,那么我的答案是“是的”。

它还将帮助您避免错误,使您的错误更容易理解。

总的来说,我会说很少有时候不使用strictwarnings是合理的。我甚至在我的单行代码中使用警告,例如:> perl -we 'print "Hello world!"'

输入几秒钟的时间,但可以节省您数小时不必要的调试工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接