导入的perl变量导入没有值
已解决:事实证明,我的问题根源在于我没有在@EXPORT_OK赋值和“use config_global qw(config DEBUGVAR);”行中把$放在DEBUGVAR前面。因为它没有引起错误,我没有办法知道这就是问题所在。因此,解决方法是在这些点的变量前面放置正确的语法 因此,我试图掌握编写和导入perl模块的诀窍。我不知道为什么这么难做到这一点,但我在这个看似微不足道的任务上遇到了很多麻烦。以下是我的模块内容:导入的perl变量导入没有值,perl,exporter,Perl,Exporter,已解决:事实证明,我的问题根源在于我没有在@EXPORT_OK赋值和“use config_global qw(config DEBUGVAR);”行中把$放在DEBUGVAR前面。因为它没有引起错误,我没有办法知道这就是问题所在。因此,解决方法是在这些点的变量前面放置正确的语法 因此,我试图掌握编写和导入perl模块的诀窍。我不知道为什么这么难做到这一点,但我在这个看似微不足道的任务上遇到了很多麻烦。以下是我的模块内容: package global_config; use strict;
package global_config;
use strict;
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(DEBUGVAR);
our ($DEBUGVAR);
our $DEBUGVAR = "Hello, World!";
return 1;
以下是导入模块的perl脚本的内容:
use strict;
use config_global qw(config, DEBUGVAR);
our %config;
our $DEBUGVAR;
print "variable imported with value: ".$DEBUGVAR;
输出为“变量导入值:”,除此之外没有其他内容。我的变量似乎正在失去它的值。我做错了什么
编辑:在进行了一些修改并打开了警告之后,我发现问题在于$DEBUGVAR从未实际导入。当我通过$config_global:DEBUGVAR使用它时,它可以正常工作。现在的问题是它没有导入到名称空间中。给出了什么?您确定要在此处使用逗号:
use config_global qw(config, DEBUGVAR);
此外,您没有导出配置,因此它在以下情况下可能工作得更好:
use config_global qw(DEBUGVAR);
我还将删除最后一个
我们的$DEBUGVAR代码>因为它可能会将其设置为undef(或者至少将其放在“use”行之前)——但我对此不确定 你把名字弄混了,看起来像:
use config_global ...
package global_config;
尽管有人会认为这会发出警告。除非您没有使用警告
预计到达时间:
另外,在该变量上有两个声明。调试时确实需要使用警告,否则将一事无成。虽然从包中导出变量不一定是推荐的做法,但要这样做,您需要使用正在导出的变量的实际名称。在这种情况下,子例程的名称是$DEBUGVAR
,而不是DEBUGVAR
在使用配置模块的脚本中,您不需要将$DEBUGVAR
变量声明为our
,因为导入的变量不受严格变量的约束。我发现了几个问题:
- 在
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\u ok
)。看一看。默认情况下,它为其子例程使用完全限定的包名
- 所讨论的变量可以通过完整的包名
$global\u 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;
要使用此模块,我只需创建一个新对象,然后将为我设置调试:
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代码。你会看到它越来越多
哈哈,是的。哇!抢手货我只是解决了它,但不幸的是,我仍然有同样的问题=/
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!";