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

yos*_*ian 0 oop perl 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;
}
Run Code Online (Sandbox Code Playgroud)

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

ike*_*ami 5

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

my $self = @_;
... $self{word} ...
Run Code Online (Sandbox Code Playgroud)

应该

my %args = @_;
... $args{word} ...
Run Code Online (Sandbox Code Playgroud)

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

my $self = {};     # Creates an anon hash and places a reference to it in $self.
Run Code Online (Sandbox Code Playgroud)

接下来,以下内容不能满足您的需求.

my @foos = @{ REF } || die(LIST);
Run Code Online (Sandbox Code Playgroud)

以下将:

my @foos = @{ REF } or die(LIST);
Run Code Online (Sandbox Code Playgroud)

以下可能会更有用:

my $foos = REF or die(LIST);
Run Code Online (Sandbox Code Playgroud)

最后,您实际上从未将数据存储在对象中.

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

$self->{definitions} = $data->{list};
$self->{tags}        = $data->{tags};
Run Code Online (Sandbox Code Playgroud)

经过几次样式更改后,您将获得我使用的内容.

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;
}
Run Code Online (Sandbox Code Playgroud)

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