我有一个创建Document对象的包:
package Document;
sub new
{
my ($class, $id) = @_;
my $self = {};
bless $self, $class;
$self = {
_id => $id,
_title => (),
_words => ()
};
bless $self, $class;
return $self;
}
sub pushWord{
my ($self, $word) = @_;
if(exists $self->{_words}{$word}){
$self->{_words}{$word}++;
}else{
$self->{_words}{$word} = 0;
}
}
我称之为:
my @docs;
while(counter here){
my $doc = Document->new();
$doc->pushWord("qwe");
$doc->pushWord("asd");
push(@docs, $doc);
}
在第一次迭代中,第一个$doc
哈希有两个元素。在第二次迭代中,第二个$doc
散列具有四个元素(包括来自第一个的两个元素)。但是当我使用那个实体对象(创建一个Document
数组)时,我得到:
为什么哈希的大小递增? Document-3具有Document-1和Document-2中的所有哈希内容。这与祝福或取消定义变量有关吗?构造函数是错误的吗?
谢谢:D
答案 0 :(得分:3)
你有两个主要问题
您初始化$self
$self = {
_id => $id,
_title => (),
_words => ()
};
非常错误,因为空括号()
不会对结构添加任何内容。如果我在此之后转储$self
我
{ _id => 1, _title => "_words" }
你也祝福$self
两次,但没有问题:这更多地表明你不明白你在做什么。
没有必要为第一次出现的单词初始化哈希元素:Perl将为您执行此操作。此外,您应该将计数初始化为1
而不是0
。
以下是您的代码正常工作的示例。我使用Data::Dump
来显示三个文档对象的内容。
use strict;
use warnings;
package Document;
sub new {
my ($class, $id) = @_;
my $self = {
_id => $id,
_words => {},
};
bless $self, $class;
}
sub pushWord {
my ($self, $word) = @_;
++$self->{_words}{$word};
}
package main;
use Data::Dump;
my $doc1 = Document->new(1);
my $doc2 = Document->new(2);
my $doc3 = Document->new(3);
$doc1->pushWord($_) for qw/ a b c /;
$doc2->pushWord($_) for qw/ d e f /;
$doc3->pushWord($_) for qw/ g h i /;
use Data::Dump;
dd $doc1;
dd $doc2;
dd $doc3;
<强>输出强>
bless({ _id => 1, _words => { a => 1, b => 1, c => 1 } }, "Document")
bless({ _id => 2, _words => { d => 1, e => 1, f => 1 } }, "Document")
bless({ _id => 3, _words => { g => 2, h => 2, i => 2 } }, "Document")