我有下面的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"); }
我有下面的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"); }
正如其他人所说,如果变量未声明为或完全合格,则使用严格变量将引发错误。这里完全合格。
如果你在一个地方给出不正确的包的名字,你会得到一个警告(虽然不是从严格):
$ perl -w
use strict;
for (@LDRATA::SUITES) { print("one\n"); }
__END__
Name "LDRATA::SUITES" used only once: possible typo at - line 3.
如果你给它一个以上的地方,Perl不具有任何方式来说明这不是故意的,所以没有错误或警告是可能的。
根据的perldoc,use strict vars
会如果变量不声明或完全限定抛出一个错误。
@LDRATA::SUITES
是一个完全合格的变量的例子。
您阅读错误'$ x'触发器,对不对? '全局符号'$ x“需要显式包名...'?似乎很自我解释。 – cHao 2013-03-19 15:19:55
如果您键入'$ main :: x',它不会抱怨。这是'$ x'的显式包名称。 – TLP 2013-03-19 15:43:05
我期望$ x上的错误。这只是一个显示错误的测试程序。我想知道为什么LDRATA不会产生错误。我从你输入的内容中了解到,如果我提供一个包名,即使是假的,我也不会得到一个错误。 – kdubs 2013-03-19 15:45:53