2010-11-10 147 views
0

有什麼區別(如果有的話)我的包「測試::測試」的這兩種封裝版本的用戶:包變量聲明問題

Test::Test; 
require Exporter; 
@ISA = qw(Exporter); 
@EXPORT = qw(hello); 
use strict; use warnings; 

our $c = 3; 
sub hello { 
    print "$_\n" for 0 .. $c; 
} 

Test::Test; 
require Exporter; 
@ISA = qw(Exporter); 
@EXPORT = qw(hello); 

$c = 3; 
sub hello { 
    print "$_\n" for 0 .. $c; 
} 

回答

4

總是啓用strictwarnings是個好習慣。這些編譯指南可以幫助您捕捉許多簡單的錯誤和拼寫錯誤。

這兩個樣本是等效的。但第一個是首選,因爲它明確聲明全局變量$c使用our並啓用約束和警告。

1

perl中的變量缺省爲全局變量,無論它們是否在模塊中聲明。 「我的」,「本地」和「我們的」關鍵字以不同的方式來限定變量。在你的例子中,「我們的$ c」限制了變量對包的可見性(除非你選擇導出它,但那是另一回事)。

因此,對於您的後一個示例,訪問和修改$ c的任何其他代碼段也會影響您的代碼。

請參閱http://perldoc.perl.org/functions/our.html瞭解有關「我們的」關鍵字的官方文檔。

+6

這並不準確。 '$ c'是包含或不包含'our'的全局包('$ Test :: Test :: c'),任何包或不包含的包都可以通過該名稱訪問它。然而,啓用'strict'vars''後,即使在'Test :: Test'中也不能調用它'$ c',除非使用'use vars'來創建一個異常,或者使用'our'創建一個詞法別名。 「我的」和「本地」當然做了完全不同的事情。 – hobbs 2010-11-10 07:48:33

+3

另請參閱http://stackoverflow.com/questions/3626190/why-are-variables-declared-with-our-visible-across-files/3626333#3626333以進一步解釋「我們」做了什麼,它有什麼不同來自'use vars',以及它爲什麼不僅僅意味着「在這個包中可見」。 – hobbs 2010-11-10 07:49:55

+0

對,它是「嚴格使用」和「我們」的重要組合。嚴格使用程序員聲明變量並考慮範圍。 – 2010-11-10 08:10:40

3

FWIW,寫這個模塊正確的方法是這樣的:

package Test::Test; 
use strict; 
use warnings; 

use Exporter 'import'; # gives you the import method directly 
our @EXPORT = qw(hello); 

my $c = 3; 
sub hello { 
    print "$_\n" for 0 .. $c; 
} 

perldoc Exporter最佳實踐寫作模塊,產品出口,對各種情況。

我還建議改變這個包的名字,因爲Test :: namespace已被核心模塊和CPAN發行版使用。