导入的perl变量导入没有值

导入的perl变量导入没有值,perl,exporter,Perl,Exporter,已解决:事实证明,我的问题根源在于我没有在@EXPORT_OK赋值和“use config_global qw(config DEBUGVAR);”行中把$放在DEBUGVAR前面。因为它没有引起错误,我没有办法知道这就是问题所在。因此,解决方法是在这些点的变量前面放置正确的语法 因此,我试图掌握编写和导入perl模块的诀窍。我不知道为什么这么难做到这一点,但我在这个看似微不足道的任务上遇到了很多麻烦。以下是我的模块内容: package global_config; use strict;

已解决:事实证明,我的问题根源在于我没有在@EXPORT_OK赋值和“use config_global qw(config DEBUGVAR);”行中把$放在DEBUGVAR前面。因为它没有引起错误,我没有办法知道这就是问题所在。因此,解决方法是在这些点的变量前面放置正确的语法

因此,我试图掌握编写和导入perl模块的诀窍。我不知道为什么这么难做到这一点,但我在这个看似微不足道的任务上遇到了很多麻烦。以下是我的模块内容:

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!";