2011-11-12 25 views
2

在perl中,如何引用hashmap数组中的值?例如,如何引用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 

回答

3

您需要指出id是一个散列键。尝试

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

顺便说一句,箭头在数组索引或散列键之后是可选的。 – choroba

+0

@choroba - 好点! –

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,但您的打印语句使用了$Name

这走在Perl 4.0时,我们可以现在use strict和预先声明的变量:

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; 

,由于没有成员函数是一个错误(又名子程序)name(又名包)人。

随着程序变得越来越复杂,你会发现这是一个救生员。

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

在面向对象的程序,所有你所要做的就是创建一个新的方法叫做薪水:

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

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

而且,你就大功告成了。

当你更熟悉这种方法Perl编程,你会发现自己先思考各种对象程序涉及,然后写方法第一。你会发现编程更快,更容易出错。

对不起讲座,但我花了很长时间使用散列数组哈希散列,并浪费了大量时间试图让这些过于复杂的事情工作。我总是希望有人更早指出我面向对象的Perl。