如何引用hashmap数组中的值?

时间:2011-11-12 23:34:14

标签: arrays perl

在perl中,如何引用hashmap数组中的值?例如,

my %person1 = (
id => 3,
name=> 'George',
age => 29,
);

my %person2 = (
id => 3,
name=> 'George',
age => 29,
);

my @persons = ( \%person1, \%person2 );
print $persons[0]->id;  #wrong

2 个答案:

答案 0 :(得分:3)

您需要指出id是一个哈希键。尝试

print $persons[0]->{id};

答案 1 :(得分:0)

现在,您已经了解了Perl引用,您可能需要查看Object Oriented Perl

package Person;

sub new {
   my $class = shift;
   %params = @_;

   my $self = {};
   bless $self, $class;

   $self->Id($params{id});
   $self->Name($params{name});
   $self->Age($params{age});

   return $self;
}

sub Id {
   my $self = shift;
   my $id   = shift;

   if (defined $id) {
      $self->{ID} = $id;
   }
   return $self->{ID};
}

sub Name {
   my $self = shift;
   my $name = shift;

   if (defined $name) {
      $self->{NAME} = $name;
   }
   return $self->{NAME};
}

sub Age {
   my $self = shift;
   my $age  = shift;

   if (defined $age) {
      $self->{AGE} = $age;
   }
   return $self->{AGE};
}

现在,要定义一个新人,请执行以下操作:

my $person = Person->new(id => "3", name => "George", age => 29);

或:

my $person = Person->new();
$person->Name("George");
$person->Id("3");
$person->Age(29);

而且,你可以像这样把它们推到阵列上:

push @persons, $person;

你可以像这样打印出他们的身份:

print $persons[0]->Id;

那么,为什么要经历所有这些麻烦?

让我们回到恐龙统治地球的古代,每个人都在用Perl 3.0编程。那时候,你没有声明变量的概念。这意味着很容易做到这一点:

$name = "bob";
print "Hello, my name is $Name\n";

糟糕!您已分配$name,但您的print语句使用了$Name

当我们现在use strict和预先声明的变量时,这在Perl 4.0中消失了:

use strict;
my $name = "bob";
print "Hello, my name is $Name\n";

这会产生错误,因为您没有声明$Name。您将看到错误消息,并立即解决问题。

现在,Perl 5.0给了我们上帝给予使用引用的权利,我们再次回到Perl 3.0,因为Perl 5.0中没有任何内容阻止我们使用未声明的哈希名称。

use strict;
my $person = {};
$person->{Name} = "bob";

print "My name is $person->{name}\n";

糟糕,没有哈希键name。它是哈希键Name

面向对象的Perl使您能够检查这些类型的错误:

my $person = Person->new();
$person->Name("Bob");
print "My name is " . $person->name;

这是一个错误,因为 class (又名包)Person中没有成员函数(又名子例程)name

随着你的程序越来越复杂,你会发现这是一个救星。

当然,另一个原因是,通过使用对象,我们可以限制代码发生变化的位置。例如,假设您突然必须开始跟踪每个人的工资。如果没有面向对象的方法,您必须检查整个程序,看看你是如何操纵@persons数组或其中的元素的。

在面向对象的程序中,您所要做的就是创建一个名为Salary的新方法

sub Salary {
   my $self = shift;
   my $salary = shift;

   if (defined $salary) {
      $self->{SALARY} = $salary;
   }
   return $self->{SALARY};
}

而且,你们都已经完成了。

随着您对Perl编程的这种方法越来越熟悉,您会发现自己首先考虑程序处理的各种对象,然后编写方法首先。你会发现编程更快,更不容易出错。

对于这个讲座很抱歉,但是我花了很长时间使用散列哈希值的哈希值,并且浪费了大量时间来尝试让这些过于复杂的事情发挥作用。我总是希望有人能够更快地将我指向面向对象的Perl。