Implementing Tree in Perl - Children cut off



我将在周末的一次工作面试中学习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,而不是我预期的4。我假设数组以某种方式被截断或非自愿地转换为标量。有什么想法吗?

主要问题是不能将数组作为单个值传递,而必须传递引用。

此外,您应该永远不要注释掉use strictuse 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;

以及主叫程序CCD_ 6。请注意,应该将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

shift只从数组中删除一个元素。填充没有它的@array

 my @array = @_;

但是,你不能直接将数组存储在哈希中,你必须使用一个引用:

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

然后你必须取消引用:

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

最新更新