2014-11-22 8 views
0

У меня есть пакет, который создает объект Document: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 «s хэш имеет два элемента. На второй итерации второй хеш $doc имеет четыре элемента (в том числе два от первого). Но когда я, что сущность объекта (создать массив Document), я получаю:

  • Документ-1 с хэш размером х
  • Документ-2 с хэш размером х + у
  • document- 3 с размером хэша x + y + z

Почему размер хэша увеличивается? Документ-3 содержит все хеш-содержимое в документах-1 и документе-2. Связано ли это с благословением или неопределением переменной? Является ли конструктор неправильным?

спасибо: D

+0

Что вы имеете в виду под "размером хэша"? – choroba

+0

oh извините, если не понятно. Я имею в виду полный элемент хэша. Таким образом, хеш документа-2 имеет весь элемент хэша Document-1. –

+0

Это не то поведение, которое я получаю. Ваш конструктор определенно ошибочен, но, пожалуйста, также покажите свой код вызова. – Borodin

ответ

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 –

Смежные вопросы