perl:模块间变量使用

perl:模块间变量使用,perl,perl-module,Perl,Perl Module,我有一个带有变量$verbose的模块misc: 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使用:

我有一个带有变量
$verbose
的模块
misc

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");
当我执行
myprog
时,我收到以下警告:

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

我做错了什么?

mymod.pm
中,您应该使用:

our $verbose = 1;
而不是:

my $verbose = 1;
该警告是因为
$misc::verbose
试图访问
misc
包中的包变量
$verbose
,顺便说一句,该变量未声明

该函数创建一个词汇范围的变量。在这种情况下,您需要一个包范围的变量,该变量是使用函数创建的


请注意

mymod.pm
中,您应该使用:

our $verbose = 1;
而不是:

my $verbose = 1;
该警告是因为
$misc::verbose
试图访问
misc
包中的包变量
$verbose
,顺便说一句,该变量未声明

该函数创建一个词汇范围的变量。在这种情况下,您需要一个包范围的变量,该变量是使用函数创建的


请注意

这是可行的,但是。请看前面两个代码示例。也检查是否要导出子程序和/或变量以添加到DaXIM的注释中。请不要手工ALAX java或C++构建访问器方法。对于较旧的perl,使用
Class::Accessor::Fast
,对于较新的perl,使用Moose。为了平衡@daxim的注释,有时公开包变量是很自然的。这对于具有运行时参数的过程接口尤其如此,程序员可能希望更改这些参数(可能通过
local()
izing)。考虑<代码> $DAT::Ungult,<代码> $CAR::VBOOSE ,<代码> $IPC::CMD::Apple Julull ARGs,等等。这些是从人们不太了解的时候真的很糟糕的接口。设置一个包变量会使在程序中使用多个实例变得困难,并且会导致调试远距离操作效果的奇怪行为。对象没有那个缺陷,所以使用Moose。这是可行的,但是。请看前面两个代码示例。也检查是否要导出子程序和/或变量以添加到DaXIM的注释中。请不要手工ALAX java或C++构建访问器方法。对于较旧的perl,使用
Class::Accessor::Fast
,对于较新的perl,使用Moose。为了平衡@daxim的注释,有时公开包变量是很自然的。这对于具有运行时参数的过程接口尤其如此,程序员可能希望更改这些参数(可能通过
local()
izing)。考虑<代码> $DAT::Ungult,<代码> $CAR::VBOOSE ,<代码> $IPC::CMD::Apple Julull ARGs,等等。这些是从人们不太了解的时候真的很糟糕的接口。设置一个包变量会使在程序中使用多个实例变得困难,并且会导致调试远距离操作效果的奇怪行为。对象没有那个缺陷,所以在声明包之前使用Moose.BTW使用模块是非常错误的。像
use strict
use diagnostics
这样的东西碰巧起作用,因为它们是词法的(即它们所在的块),不关心包,但其他人关心它们所在的包,特别是在导出函数时。因此,应该是“package mymod;use…”?顺便说一句,在声明包之前使用模块是非常错误的。像
use strict
use diagnostics
这样的东西碰巧起作用,因为它们是词法的(即它们所在的块),不关心包,但其他人关心它们所在的包,特别是在导出函数时。因此,应该是“package mymod;use…”?谢谢