我看到几个问题:
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 代码。你会越来越多地看到它。