2013-03-19 64 views
1

我有下面的Perl代码。我使用-w并严格使用。为什么@LDRATA :: SUITES不会产生错误? $ x呢?perl为什么这不会在严格使用时产生错误?

#!/grid/common/bin/perl -w 
use strict; 

for (@LDRATA::SUITES) { print("one\n"); } 
for ($LDRATA::SUITES[0]) { print("two\n"); } 
for($x) { print("three\n"); } 
+1

您阅读错误'$ x'触发器,对不对? '全局符号'$ x“需要显式包名...'?似乎很自我解释。 – cHao 2013-03-19 15:19:55

+0

如果您键入'$ main :: x',它不会抱怨。这是'$ x'的显式包名称。 – TLP 2013-03-19 15:43:05

+0

我期望$ x上的错误。这只是一个显示错误的测试程序。我想知道为什么LDRATA不会产生错误。我从你输入的内容中了解到,如果我提供一个包名,即使是假的,我也不会得到一个错误。 – kdubs 2013-03-19 15:45:53

回答

5

正如其他人所说,如果变量未声明为或完全合格,则使用严格变量将引发错误。这里完全合格。

如果你在一个地方给出不正确的包的名字,你会得到一个警告(虽然不是从严格):

$ perl -w 
use strict; 

for (@LDRATA::SUITES) { print("one\n"); } 
__END__ 
Name "LDRATA::SUITES" used only once: possible typo at - line 3. 

如果你给它一个以上的地方,Perl不具有任何方式来说明这不是故意的,所以没有错误或警告是可能的。

+0

谢谢。我有一种感觉,那将是答案。在将来我会用我的拼写错误来更加小心。 I – kdubs 2013-03-19 17:05:21

+0

@kdubs或者,使用更少的全局变量。 – darch 2013-03-19 21:28:06

5

根据的perldoc,use strict vars会如果变量不声明或完全限定抛出一个错误。

@LDRATA::SUITES是一个完全合格的变量的例子。

+0

所以即使我没有使用LDRATA,或者我的LDRATA在某个地方,这最终是完全合格的吗?我有一个很大的错字,我错误地输入了一个包名。我希望在这种情况下出现错误。 – kdubs 2013-03-19 15:48:26

+0

是的。带有'::'的标识符是完全限定的。 – mob 2013-03-19 15:56:56

相关问题