2013-03-19 33 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

相關問題