2012-08-14 68 views
0

我有一個模塊misc具有可變$verboseperl的:模塊間變量使用

use strict; 
use diagnostics; 
package misc; 
my $verbose = 1; 

和模塊mymod其使用misc

use strict; 
use diagnostics; 
use misc; 
package mymod; 
sub mysub ($) { 
    ... 
    ($misc::verbose > 0) and print "verbose!\n"; 
} 

這,反過來,由myprog使用:

use strict; 
use diagnostics; 
use misc; 
use mymod; 
mymod::mysub("foo"); 

當我exe可愛myprog,我得到這樣的警告:

Use of uninitialized value $misc::verbose in numeric gt (>) at mymod.pm line ... 

我究竟做錯了什麼?

+1

順便說一句在聲明一個包之前使用模塊是微妙的錯誤。像'use strict'和'use diagnostics'這樣的事情發生了,因爲它們是詞法的(即它們在哪個塊中)並且不關心包,但其他人關心它們在哪個包中,特別是如果它們導出函數。 – Schwern 2012-08-14 17:46:08

+0

所以,它應該是「包mymod;使用...」?謝謝。 – sds 2012-08-14 19:27:49

回答

3

mymod.pm你應該使用:而不是

our $verbose = 1; 

my $verbose = 1; 

該警告是因爲$misc::verbose嘗試訪問包變量$verbosemisc包,順便說一句,沒有聲明。

my函數創建一個詞彙範圍變量。在這種情況下,您需要使用our函數創建的包範圍變量。

請關注daximcomment

+3

這可行,但[良好的編程習慣規定您不允許外部代碼直接混淆模塊數據,而是必須通過中介,例如訪問器例程](http://stackoverflow.com/a/ 3110097)。請參閱前兩個代碼示例。 – daxim 2012-08-14 17:37:53

+0

是的,我同意,natürlich。 :-) – 2012-08-14 17:44:06

+0

如果要導出子程序和/或變量,請查看[Exporter](http://search.cpan.org/~toddr/Exporter-5.66/lib/Exporter.pm) – 2012-08-14 18:03:19