在 Perl 中实现树 - Children 切断
Implementing Tree in Perl - Children cut off
我将在周末学习 Perl 以参加工作面试。为了更深入地了解我正在尝试实现一棵树 class.
#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;
为了测试(故障)树 class 我已经实现了以下测试脚本。
#!/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
。我假设数组以某种方式被切断或非自愿地转换为标量。有任何想法吗?
shift
仅从数组中删除一个元素。在没有它的情况下填充 @array
:
my @array = @_;
但是,您不能直接将数组存储在散列中,您必须使用引用:
return bless { content => $content,
array => \@array,
}, $class;
然后您必须取消引用:
my @array = @{ $self->{array} };
return scalar @array
主要问题是您不能将数组作为单个值传递——您必须传递一个引用。
另外,你应该永远不要注释掉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
我将在周末学习 Perl 以参加工作面试。为了更深入地了解我正在尝试实现一棵树 class.
#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;
为了测试(故障)树 class 我已经实现了以下测试脚本。
#!/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
。我假设数组以某种方式被切断或非自愿地转换为标量。有任何想法吗?
shift
仅从数组中删除一个元素。在没有它的情况下填充 @array
:
my @array = @_;
但是,您不能直接将数组存储在散列中,您必须使用引用:
return bless { content => $content,
array => \@array,
}, $class;
然后您必须取消引用:
my @array = @{ $self->{array} };
return scalar @array
主要问题是您不能将数组作为单个值传递——您必须传递一个引用。
另外,你应该永远不要注释掉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