2013-09-04 4 views
1

Пытался написать модуль perl с OOP, но он может добавить объект в массив, когда я использую метод Dump, он выдаст неверные данные, подобные этому. Где моя ошибка?Атрибут массива Perl внутри объекта

Благодаря

bless({ 
       '_name' => 'CUSIP', 
       '_validation_array' => [], 
       '_seq' => '1' 
       }, 'Field'); 

исходный код:

package Field; 

    sub new { 
    my $class = shift; 
    my $self = { 
     _name => shift, 
     _seq => shift, 
     _validation_array => [ @_ ], 
    }; 

    bless($self, $class); 
    return $self; 
}; 

sub pushValidation(){ 
    my $validation = shift; 
    push(@{$self->{_validation_array}}, $validation);  
}; 

sub dump(){ 
    foreach my $validation (@{$self->{_validation_array} }) { 
     #print Dumper($validation);#will work, 
     print $validation->{name}; #error, Use of uninitialized value 
    } 
}   
    1; 

Это так, как я называю этот метод:

my $validationObj = new Validation($validation->{name}, $validation->{seq}); 
$field->pushValidation($validationObj); 

ответ

6

Я вижу несколько проблем здесь, но самый серьезный один является здесь:

sub pushValidation() { 
    my $validation = shift; 
    push(@{$self->{_validation_array}}, $validation);  
}; 

Эта функция ожидает аргумент $self, но не переносит его из аргументов. Вам нужно добавить use strict; в начало вашего файла Perl. Если он был включен, то вопрос был бы сразу видно:

Global symbol "$self" requires explicit package name at <filename> line <line>. 

То же самое относится и к функции dump(). (Кстати, dump - это плохое имя метода, так как есть встроенная функция встроенного Perl с тем же именем. Но это не огромная проблема.)

+0

правильно, я поставил «использовать строгое», я вижу эта ошибка. как это исправить? – user595234

+0

Вам нужно перевести '$ self' в качестве первого аргумента функции - например, добавить' my $ self = shift; 'перед аргументом' $ validation'. В качестве альтернативы распакуйте оба в одном: 'my ($ self, $ validation) = @_;'. – duskwuff

+0

Я сделал это изменение, внутри дампа, используйте print $ validation -> {name}; по-прежнему возникают ошибки, «Использование неинициализированного значения в печати» – user595234

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