我正在编写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
的分配。
答案 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请求和解析响应。