显然,use strict
当您想强制perl正确编码(可能会强制声明),在字符串和subs(即裸字)上显式或谨慎使用refs时,应使用(必须)。注意:如果存在错误,则使用strict会中止执行(如果使用)。
虽然use warnings;
可以帮助您找到程序中的键入错误,就像您错过了分号一样,但是您使用的是'elseif'而不是'elsif',而是使用了不赞成使用的语法或函数,诸如此类。注意:使用警告只会提供警告并继续执行,即不会中止执行。
无论如何,如果我们详细介绍一下,那会更好,我在下面指定
来自perl.com(我的最爱):
使用严格的“ vars”;
这意味着您必须在使用变量之前始终声明它们。
如果不声明,可能会收到未声明变量的错误消息
全局符号“ $ variablename”在scriptname.pl第3行需要显式的程序包名称。
这个警告意味着Perl不清楚变量的范围是什么。因此,您需要对变量进行明确说明,这意味着要么用声明它们,my
以便将它们限制在当前块内,要么用完全限定的名称引用它们(例如:$ MAIN :: variablename)。
因此,如果您尝试访问至少不满足以下条件之一的变量,则会触发编译时错误:
使用严格的“ subs”;
考虑两个程序
# prog 1
$a = test_value;
print "First program: ", $a, "\n";
sub test_value { return "test passed"; }
Output: First program's result: test_value
# prog 2
sub test_value { return "test passed"; }
$a = test_value;
print "Second program: ", $a, "\n";
Output: Second program's result: test passed
在这两种情况下,我们都有一个test_value()子项,并将其结果放入$ a中。但是,当我们运行两个程序时,我们得到两个不同的结果:
在第一个程序中,至此为止$a = test_value;
,Perl不知道任何test_value()子项,并且test_value被解释为字符串'test_value'。在第二个程序中,test_value()的定义在该$a = test_value;
行之前。Perl认为test_value是子调用。
对于隔离的话犹如test_value这可能是潜艇,并且可能依赖于上下文字符串的技术术语,顺便说一句,是裸字。Perl对裸字的处理可能会造成混乱,并且可能导致程序中的错误。
该错误是我们在第一个程序中遇到的错误,请记住,Perl不会期待find test_value()
,所以由于尚未看到test_value(),因此它假定您需要一个字符串。因此,如果您使用use strict subs;
,它将导致该程序死于错误:
在./a6-strictsubs.pl第3行使用“ strict subs”时,不允许使用标语“ test_value”。
解决该错误的方法是
1.使用括号使您清楚地知道正在调用子程序。如果Perl看到$ a = test_value();,
2.在第一次使用它之前声明它
use strict;
sub test_value; # Declares that there's a test_value() coming later ...
my $a = test_value; # ...so Perl will know this line is okay.
.......
sub test_value { return "test_passed"; }
3.如果要使用它作为字符串,请引用它。
因此,这种限制使Perl将所有裸字都视为语法错误。* 裸词是没有上下文强制进行其他解释的任何裸名或标识符。(上下文通常是由附近的关键字或标记或通过预先声明所涉及的单词来强制执行的。)*因此,如果您打算将其用作字符串,请对其加引号;如果您打算将其用作函数调用,请对其进行预声明或使用括号。
由于这种不可预测的行为,因此标语很危险。use strict; (or use strict 'subs';)
使它们可预测,因为将来可能会导致奇怪行为的裸字会使您的程序在对其造成严重破坏之前就死掉
在一个地方,即使打开了严格的subs,也可以使用裸字:分配哈希键时。
$hash{sample} = 6; # Same as $hash{'sample'} = 6
%other_hash = ( pie => 'apple' );
哈希键中的关键字始终被解释为字符串,因此没有歧义。
使用严格的“引用”;
如果您有意或以其他方式使用符号引用,则会生成运行时错误。然后,将不是硬引用的值视为符号引用。即,该引用被解释为表示全局变量名称的字符串。
use strict 'refs';
$ref = \$foo; # Store "real" (hard) reference.
print $$ref; # Dereferencing is ok.
$ref = "foo"; # Store name of global (package) variable.
print $$ref; # WRONG, run-time error under strict refs.
使用警告;
这个词法作用域的编译指示允许灵活地控制Perl的内置警告,既包括编译器发出的警告,也包括来自运行时系统的警告。
来自perldiag
:
因此,可以使用warnings
编译指示来控制来自以下类别的大多数警告消息,即W,D和S。
(W)警告(可选)
(D)弃用(默认情况下启用)
(S)严重警告(默认情况下启用)
我已经按类别列出了一些经常出现的警告消息。有关它们和其他消息的详细信息,请参考perldiag
(W)警告(可选):
%s中
缺少参数-%c中缺少参数
(您是指&%s吗?)
(您是指“本地”而不是“我们的”吗?)
(您是指$还是@而不是%?)
'%s '不是
%s上使用的代码参考length()
在数字上错位_
(D)弃用(默认情况下启用):
已弃用define(@array)已弃用
defined(%hash)
已
不再支持在假条件$#中 不建议使用my()
(S)严重警告(默认情况下启用)
elseif应该是elsif
%s,它在运算符期望的位置找到
(%s之前是缺少运算符?)
(上一行缺少分号吗?)
%s从未引入过
运算符或分号
。
原型不匹配:%s与%s
警告:不带括号的“%s”使用不明确
无法打开%s:%s
use loose;