Я вижу несколько вопросов:
- Вы не должны использовать запятую в синтаксисе
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);
- Вы должны использовать более новый синтаксис Exporter:
Вот новый синтаксис Exporter:
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. Вы будете видеть это все больше и больше.