2012-04-12 85 views
0

這是usex.pl:爲什麼嚴格抱怨來自其他腳本的變量?

#use strict; 
require 'x.pl'; 
print $x; 

這裏是x.pl:

#use strict; 
our $x = 99; 
1; 

它,如運行良好。如果我取消在usesx.pl使用嚴格的線,我得到

Global symbol "$x" requires explicit package name 

使用與否的x.pl嚴格,似乎已經不重要了(除非我把「我們的」關鍵字,但我對此不感興趣。)

我對Perl相當陌生。爲什麼在主腳本中嚴格使$ x不可見,以及對此的正常解決方案是什麼?

回答

5

呵呵,our不容易混淆,因爲它混合了全局和詞彙範圍的概念。它所做的是從strict 'vars'雜注中免除一個全局變量,並允許在它的作用域(即封閉塊)或當前文件的結尾(無論首先出現)對它進行無限制訪問。 Read the full (but brief) story in the manual,也可通過在命令行上說perldoc -f our來訪問。

至於你的腳本,你可以通過修改變量訪問使用全限定名驗證的手冊中的話的真實性:

use strict; 
require 'x.pl'; 
print $main::x; 
7

兩個原因。

  1. 錯誤發生在編譯時,在執行require之前。這很容易使用BEGIN修復。

  2. our是詞彙範圍的,它位於與print不同的詞法作用域(文件或塊)中,因此它不再有效。

整個方法基本上是不好的。這裏有一個更好的方法:

package MyConfig; 
use strict; 
use warnings; 
use Exporter qw(import); 
our @EXPORT = qw($x); 
our $x = 123; 
1; 

use strict; 
use warnings; 
use MyConfig; 
print "$x\n"; 
相關問題