我还在学习一些面向对象的perl,我在如何访问我的课程时遇到了一些困难。
我已经成功创建了一个类,其中一个属性是哈希。当我想直接打印此哈希中给定键的值时,输出始终为空白。如果我将一个新变量赋值给哈希值,那么我可以打印这个变量。
玩具示例代码:
sub new {
my($clas) = @_;
my($self) = {};
bless($self,$clas);
$self->{age_record} = {};
return($self);
}
填充哈希值的虚构代码
my $class->new("class");
fill_hash($class);
让我们使用Data :: Dumper查看哈希中的内容。
print Dumper $class->{age_record};
$VAR1 = {
'Rigobert' => 17,
'Helene' => 42
};
如果我直接打印,我什么也得不到。
print $class->{age_record}{'Rigobert'};
但如果我先把它作为一个新变量,它就可以了。
my $age = $class->{age_record}{'Rigobert'};
print "Age is : $age\n";
我得到了
Age is : 17
引用哈希属性时我做错了什么?
答案 0 :(得分:2)
据我所知,没有任何问题,我能想到的输出没有出现的唯一原因是它是缓冲的。你应该尝试添加
STDOUT->autoflush;
靠近程序顶部。
但是,您不应该从调用代码访问内部数据结构。 fill_hash
应该是更好的名称方法,您需要编写访问者方法才能访问age_record
元素。像这样的东西
sub pupil_age {
my $self = shift;
my ($name) = @_;
$self->{age_record}{$name};
}
然后你可以把它称为
printf "Age is : %d\n", $class->pupil_age('Rigobert');
(printf
只是一种风格选择 - 没有其他需要在简单的print
上方使用它
答案 1 :(得分:0)
我对这条线感到困惑
my $class->new("class");
应该是这样的:
my $class = Class->new();
(假设你的班级名字是“班级” - 有一个名为“班级”的班级让人很困惑。我假设你有一个学术班级的班级建模!)
然后你就有了添加瞳孔的方法。
sub add_pupil {
my ($self, $name, $age) = @_;
$self->{age_record}{$name} = $age;
}
另一种获得学生的方法。
sub get_pupil {
my ($self, $name) = @_;
return $self->{age_record}{$name};
}
然后你就这样使用它。
my $class = Class->new();
$class->add_pupil('Rigobert', 17);
$class->add_pupil('Helene', 42);
print $class->get_pupil('Rigobert'); # prints 17
我觉得你很困惑,因为你还没有真正想过如何在课堂上建模你的数据。我不能提供更多帮助,因为我不知道其他属性是什么或者fill_hash()
子例程是什么样的。