在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
在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
您需要指出id
是一个散列键。尝试
print $persons[0]->{id};
现在,你有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。
顺便说一句,箭头在数组索引或散列键之后是可选的。 – choroba
@choroba - 好点! –