全球符号"%self"在Perl模块中需要显式包名称

时间:2014-07-18 15:51:52

标签: perl oop perl-module

我正在编写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的分配。

1 个答案:

答案 0 :(得分:5)

声明了标量$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请求和解析响应。