如何在perl中访问标量是否是类的哈希属性?

时间:2015-05-08 07:38:22

标签: perl hash

我还在学习一些面向对象的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

引用哈希属性时我做错了什么?

2 个答案:

答案 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()子例程是什么样的。