2012-08-14 71 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