我们应该避免为完整的程序打开警告吗?

Cha*_*hak 4 perl

我已经订阅了beginners@perl.org 正在进行的讨论,一个人建议你不要使用

#!/usr/bin/perl -w
Run Code Online (Sandbox Code Playgroud)

这将打开完整程序的警告.他说:

请不要在hashbang中使用-w,它会强制到处警告,即使模块不需要警告.如果你把它留在里面,你会得到奇怪的错误信息.而只是写"使用警告"; 在代码的顶部,你会没事的.:)

它会激活您未编写的代码的警告.

为您自己编写的所有代码启用警告是一个非常好的主意.但是,如果您为不想要警告的作者或旧模块编写的代码启用它,那么您将获得无法修复的无意义消息.

我说:所以你想说我们应该只在代码的某些部分使用警告.

他回答说:是的,具体来说:只有你自己编写的代码.

而不是这样做你应该warnings在自己编写的代码中使用pragma而不是完整的程序.


我曾经在shebang中写过-w,这样我就可以打开完整程序的警告.但在讨论之后,我很困惑我是否应该跟随那个人.他是对的吗?我们应该避免为完整的程序打开警告吗?

通常我遵循的是

#!/usr/bin/perl
use strict;
use warnings;

#now start actual coding from here
#...............................
#...............................
Run Code Online (Sandbox Code Playgroud)

Dav*_*idO 6

你已经相当准确地描述了这种情况.-w全局打开警告(在所有模块中,除非它们特别在词汇上关闭它们). use warnings在词汇上表现,不影响其他模块中发生的事情.

话虽如此,我不认为这是一个更好的问题.这真的是你想要的行为.我们不会说这foreachwhile不了解断言的背景更好.如果您希望通过各种方式在全球范围内启用警告,请执行此操作.如果要以不影响外部模块的方式打开警告,请执行此操作.

在我看来,警告是一种开发和调试工具.我尝试总是用'on'(在我自己的代码中)警告编程.我是否在启用警告的情况下将代码部署到生产中是另一回事.有许多因素有助于决定是否应在生产代码中启用警告.当然,目标是无警告.因此,如果在生产代码中启用了警告,并且只有一个消失,那么如果我们正确地完成工作,就不会发生这种警告.但如果一个人漏掉了,这些信息对任何人都有帮助吗?并且有用性是否会超过增加的噪音和将程序信息暴露给未知最终用户的潜在风险?

关于编写无警告代码的主题:是的,这应该始终是目标.但是有很多警告. my @list = qw/ Just another Perl hacker, /;会触发警告.这个警告旨在帮助我意识到我可能犯了一个错误(在qw //列表中嵌入一个逗号).但正如许多人所知,这句话的确以逗号结尾.这里更大的问题是我是否真的打算列出单词而不是单个字符串.所以我要说我确实需要一个单词列表,并且一个单词在其末尾合法地需要一个逗号.在这种情况下,警告是轻浮的.我有两个选择.一个,比方说my ( @list ) = ( 'Just', 'another', 'Perl', 'hacker,' );,或说两个my ( @list ) = do{ no warnings 'qw'; qw/Just another Perl hacker,/; };.它们都是很多打字,在这个人为的例子中,最好只是咬紧牙关并使用第一个选项.但这并不意味着第二种选择是错误的,并且可能存在许多设计不明确的警告不可取的例子.

现在让我们看一下在另一个模块中触发警告可能有用的情况:你一直在撕扯你为什么没有从XYZ模块获得预期结果.你可以使用print语句来编写你的代码,你可以转储你的数据结构,你可以深入到Perl调试器......但是在全局启用警告有什么问题,如果只是为了一次运行,看看你正在做的事情是否会产生问题在远处,模块内的无声故障?显然,如果你把垃圾送到垃圾桶里,一个写得很好的模块会给你带来麻烦.但是应该/会......这取决于该模块的作者.什么事到的是,你可以提升到一个警告的东西,可能在之前一直保持沉默的失败.鉴于这是一个如此简单的调试步骤,在使用调试器逐步执行代码之前,可能值得一试.

您已经发现了这一点,但是为了其他读者,perllexwarn讨论了-w,使用警告和$ ^ W之间的区别.