我发现了几个问题:
- 您不应该在
qw() 语法中使用逗号。 qw 将每个空格分隔的短语放入一个数组元素中。
这两个是一样的:
my @bar = qw(foo bar barfu); #No commas!
my @bar = ("foo", "bar", "barfu"); #Commas Required
你有:
our @EXPORT_OK = qw(DEBUGVAR);
应该是:
our @EXPORT_OK = qw($DEBUGVAR);
这是更新的导出器语法:
package global_config;
use strict;
use warnings;
use Exporter 'import'; #Not "require". No need for "@ISA"
our @EXPORT_OK = qw(DEBUGVAR);
our $DEBUGVAR = "Hello, World";
1; #Makes no real difference, but you shouldn't say "return 1". Just standard.
- 最后,你在做什么导出变量?这只是一个不好的做法。
- 现在导出任何东西都受到质疑——甚至是函数。它污染了用户的命名空间。 (至少您使用的是
@EXPORT_OKAY)。看看File::Spec。默认情况下,它为其子例程使用完全限定的包名称。
- 有问题的变量可以通过完整的包名
$global_config::DEBUGVAR 访问,因此没有必要导出它。
- 如果每个人都这样做呢?是的,你最后一次听说这个借口是在幼儿园,但它适用于这里。想象一下,如果有几个模块导出了
$DEBUGVAR。
有几种方法可以解决您的难题,但最好的方法是使用面向对象的 Perl 来帮助设置此变量,甚至允许用户更改它。
package MyPackage;
use strict;
use warnings;
use feature qw(say);
sub new {
my $class = shift;
my $debug = shift; #Optional Debug Value
my $self = {};
bless $self, $class;
if (not defined $debug) {
$debug = "Hello, world!";
$self->Debug($debug);
return $self;
}
sub Debug {
my $self = shift;
my $debug = shift;
if (defined $debug) {
$self->{DEBUG} = $debug;
}
return $debug;
}
1;
要使用这个模块,我只需创建一个新对象,然后会为我设置 Debug:
use strict;
use warnings;
use MyPackage #No exporting needed
#Create an object w/ Debug value;
my $obj = MyPackage->new; #Debug is the default.
say $obj->Debug; #Prints "Hello, world!"
# Change the value of Debug
$obj->Debug("Foo!");
say $obj->Debug; #Now prints "Foo!"
#Create a new object with a different default debug
$obj2 = MyPackage->new("Bar!");
say $obj2->Debug; #Print "Bar!";
这解决了几个问题:
- 它允许调试多个值,因为每个对象现在都有自己的值
- 无需担心命名空间污染或访问包变量。同样,您需要的一切都包含在对象本身中。
- 由于复杂性隐藏在对象本身中,因此更容易调试问题。
- 这是新的首选方法,因此您不妨习惯这种语法并能够阅读面向对象的 Perl 代码。你会越来越多地看到它。