2015-03-21 3 views
0

Я должен изучить Perl для собеседования на выходные. Чтобы получить более глубокое понимание, я пытаюсь реализовать древовидный класс.Реализация дерева в Perl - Дети отрезаны

#use strict; 
#use warnings; 

package Tree; 

sub new { 
    my $class = shift @_; 
    my $content = shift @_; 
    my @array = shift @_; 
    return bless { "content" => $content, "array" => @array }, $class; 
} 

sub num_children { 
    my $self = shift @_; 
    my @array = $self->{"array"}; 
    return scalar @array; 
} 

return 1; 

Для проверки дерева дефектов я выполнил следующий тестовый скрипт.

#!/usr/bin/perl 

require Tree; 

my $t = Tree->new("#", undef); 
my $tt = Tree->new("*", undef); 
my $tttt = Tree->new("-", undef); 
my $ttttt = Tree->new(".", undef); 

my @list =(); 
push @list, $tt; 
push @list, $t; 
push @list, $tttt; 
push @list, $ttttt; 


my $ttt = Tree->new("+", @list); 

print $ttt->num_children(); 

К сожалению, выход 1 вместо моего expection из 4. Я предполагаю, что массив как-то отрезан или невообразимо преобразован в скаляр. Есть идеи?

ответ

5

Основная проблема заключается в том, что вы не можете передавать массивы как одно значение - вместо этого вам нужно передать ссылку.

Кроме того, вы должны никогда комментариев use strict и use warnings. Они являются важными инструментами отладки, и если вы получаете сообщения об ошибках с ними, вы должны исправить ошибки, которые они отмечают.

Вот рабочий Tree.pm

use strict; 
use warnings; 

package Tree; 

sub new { 
    my $class = shift; 
    my ($content, $array) = @_; 
    return bless { content => $content, array => $array }, $class; 
} 

sub num_children { 
    my $self = shift; 
    my $array = $self->{array}; 
    return scalar @$array; 
} 

1; 

и вызывающая программа tree_test.pl. Обратите внимание, что вы должны use, а не require модуль.

#!/usr/bin/perl 

use strict; 
use warnings; 

use Tree; 

my @list = map { Tree->new($_) } ('#', '*', '-', '.'); 

my $ttt = Tree->new('+', \@list); 

print $ttt->num_children, "\n"; 

выход

4 
1

shift удаляет только один элемент из массива. Заполняем @array без него:

my @array = @_; 

Но, вы не можете хранить массив в хэш напрямую, вы должны использовать ссылку:

return bless { content => $content, 
       array => \@array, 
      }, $class; 

которые вы затем должны разыменованием:

my @array = @{ $self->{array} }; 
return scalar @array 
Смежные вопросы