2014-11-22 81 views
0

的名單我有一個創建一個文檔對象包:的Perl OO - 創建對象

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

+0

你所說的 「散列大小」 是什麼意思? – choroba 2014-11-22 17:36:43

+0

哦,對不起,如果它不明確。我的意思是散列的總元素。因此,Document-2的散列具有Document-1散列的所有元素。 – 2014-11-22 17:39:05

+0

這不是我得到的行爲。你的構造函數肯定是錯誤的,但也請顯示你的調用代碼。 – Borodin 2014-11-22 17:46:16

回答

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") 
+1

它解決了我的問題,你也教我如何使用'Data :: Dump'。感謝您回答我這樣的新手提出的問題:D – 2014-11-22 18:13:07