【问题标题】:Global symbol "%self" requires explicit package name in Perl module全局符号“%self”需要 Perl 模块中的显式包名
【发布时间】:2014-07-18 15:51:52
【问题描述】:

我正在编写一个 Perl 模块,并且在运行测试时遇到了这个令人困惑的错误消息。

sub new {
  my $class = shift;
  my $self = @_;
  $word = $self{word} || die "No word provided.";
  @definitions = @{decode_json(get($urban_url . $word))->{'list'}} || die "Error during fetch/decode.";
  @tags = @{decode_json(get($urban_url . $word))->{'tags'}} || "Error during fetch/decode.";
  bless($self, $class);
  return $self;
}

如您所见,$self 已正确声明。 word 是在new 子例程之上声明的全局变量。在use语句的每个测试中都会发生失败,并追溯到$word的分配。

【问题讨论】:

  • 是的,确实如此。代表我犯了愚蠢的错误。我将其更改为my ($class, %self) = @_;,现在它似乎可以正常工作了。
  • 在这种情况下不要使用%self 名称。使用%in%params
  • @woodruffw:正如 Vadim 所说,不要使用名为 %self 的哈希。 $self 始终是对当前对象的(标量)祝福引用
  • 我没有意识到这一点。谢谢。

标签: perl oop perl-module


【解决方案1】:

标量 $self 已声明,但您使用的是不存在的哈希 %self

my $self = @_;
... $self{word} ...

应该是

my %args = @_;
... $args{word} ...

当然,你仍然需要$self。您希望它是对新空哈希的引用。你需要:

my $self = {};     # Creates an anon hash and places a reference to it in $self.

接下来,以下不做你想要的。

my @foos = @{ REF } || die(LIST);

以下将:

my @foos = @{ REF } or die(LIST);

以下内容可能会更有用:

my $foos = REF or die(LIST);

最后,您永远不会将数据实际存储在对象中。

my $data = decode_json(get($urban_url . $word));
   or die("Error during fetch/decode\n");

$self->{definitions} = $data->{list};
$self->{tags}        = $data->{tags};

经过一些样式更改后,您会得到我会使用的东西。

sub new {
   my ($class, %args) = @_;

   my $word = $args{word}
      or die("No word provided");

   my $data = decode_json(get($urban_url . $word));
      or die("Error during fetch/decode\n");

   my $self = bless({}, $class);

   $self->{definitions} = $data->{list};
   $self->{tags}        = $data->{tags};

   return $self;
}

我撒谎了。我怀疑我会在对象构造函数中执行 Web 请求并解析响应。

【讨论】:

  • 谢谢!这很有帮助。
  • 我说的大部分内容都不合适——问题远比我意识到的要多——所以我只是做了一个重大更新。
  • 再次感谢。我重写了大部分模块以按程序执行而不是面向对象,但这仍然很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
相关资源
最近更新 更多