在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
答案 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。