Perl OO - 创建对象列表

时间:2014-11-22 17:30:01

标签: perl oop object hash

我有一个创建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数组)时,我得到:

  • 文档-1,散列大小为x
  • 文档-2,散列大小为x + y
  • 文档-3,散列大小为x + y + z

为什么哈希的大小递增? Document-3具有Document-1和Document-2中的所有哈希内容。这与祝福或取消定义变量有关吗?构造函数是错误的吗?

谢谢:D

1 个答案:

答案 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")