【问题标题】:Is it necessary to use warnings when already use strict?已经使用严格时是否有必要使用警告?
【发布时间】:2011-09-19 06:48:50
【问题描述】:

代码如下:

use strict;
use warnings;

这里需要use warnings;吗?

【问题讨论】:

标签: perl


【解决方案1】:

是的,这是必要的。

use strictuse warnings 做不同的事情。

来自strict 模块的手册页:

strict - Perl pragma 限制不安全的结构

来自perlrun(对于-w):

打印关于可疑的警告 结构,例如变量名 只提到一次的标量变量 用过的 在设置之前,重新定义子例程,引用 不明确的 文件句柄或文件句柄以只读方式打开 尝试写入,用作数字的值不 看 像数字一样,使用数组就好像它是一个标量,如果 您的 子程序递归超过 100 深,以及无数其他 东西。

【讨论】:

  • 有没有例子表明use warnings 做了额外的事情?
  • 你应该引用 perldiagperllexwarnuse warnings 而不是 perlrun -w
  • @daxim 确实有用的参考资料,但没有像我从 perlrun 中引用的那样简明扼要的总结。
【解决方案2】:

是的。严格防范非常有限的事情。警告会提醒您注意一系列不同且范围更广的问题。

【讨论】:

    【解决方案3】:

    几天前这里也出现了同样的问题:Which safety net do you use in Perl?。该链接导致对严格、警告、诊断和其他类似主题的讨论。

    【讨论】:

      【解决方案4】:

      是的,考虑一下:

      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 v 5.8.8 下我没有得到Use of uninitialized value $f in multiplication (*) at -e line 1.
      • 你确定吗?刚刚在 5.8.8 和 5.10.1 上测试过。两者都给出相同的错误信息。你也许有一个修改过的 Perl 版本?或者你忘了use warnings;
      • @new_perl,那么你的 Perl 安装非常糟糕。 (我认为 5.8.8 在警告中没有提到$f,但确实发出了警告。)
      【解决方案5】:

      在这个词的实际含义中,它不是必要的。也就是说,程序不需要它来运行。人们常常忘记必要是什么意思。

      但是,如果您的问题是“是否严格启用警告?”,答案是否定的。您可以通过reading its documentation 看到 strict 的作用。

      warnings 通常有助于指出您应该解决的问题。但是,Perl 的警告不需要您修复它们,因此即使发出警告,您的程序也可以继续运行。

      有些人会告诉您始终使用警告,但他们制定了这种规则,因此他们不必考虑它或向不会考虑它的人解释它。除了“始终使用警告”之外,说任何其他内容都是不受欢迎的立场。

      warnings 是开发人员的工具,如果看到警告的人不知道它们是什么或如何处理它们,它们可能只会引起烦恼或困惑。我见过一些例子,新的 perls 开始为程序发出新的警告,然后由于没有人监视日志文件而填满了磁盘。

      我有一个更细微的规则“当你要对它们做某事时使用警告,如果你不想就不要使用它们”。

      我什至没有说“始终编写无警告代码”。我编写了很多代码,我将只运行一次,或者从命令行运行,或者在我不关心马虎的其他情况下运行。我不喜欢向其他人提供警告肮脏的代码,但我不会因为我为自己做的小事而沉迷于此。

      【讨论】:

      • 严厉反对那些你不同意观点的人。在我的情况下,答案是基于将问题解释为use warningsuse strict的子集?” - 即use strict完全不需要use warnings
      【解决方案6】:

      “你所说的必要是什么意思?”是我的答复。

      如果你认为strictwarnings 是同一个东西,那你就错了。这里的其他人对每个 pragma 都给出了很好的答案。

      use warnings 通常会让你成为更好的程序员。如果学习很重要,那么我的回答是“是”。

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

      一般来说,我会说很少有保证不同时使用strictwarnings。我什至在我的单行中使用警告,例如> perl -we 'print "Hello world!"'

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

      【讨论】:

        猜你喜欢
        • 2013-02-02
        • 1970-01-01
        • 2011-08-28
        • 2011-07-22
        • 2015-01-30
        • 2017-04-26
        • 2021-03-09
        • 1970-01-01
        相关资源
        最近更新 更多