需要

2013-12-12 70 views
1

假設我有類明白幾件事情有關類需要

package Person; 
# Class for storing data about a person 
#person7.pm 
use warnings; 
use strict; 
use Carp; 
my @Everyone; 
sub new { 
    my $class = shift; 
    my $self = {@_}; 
    bless($self, $class); 
    push @Everyone, $self; 
    return $self; 
} 
# Object accessor methods 
sub address { $_[0]->{address }=$_[1] if defined $_[1]; $_[0]->{address } } 
sub surname { $_[0]->{surname }=$_[1] if defined $_[1]; $_[0]->{surname } } 
sub forename { $_[0]->{forename}=$_[1] if defined $_[1]; $_[0]->{forename} } 
sub phone_no { $_[0]->{phone_no}=$_[1] if defined $_[1]; $_[0]->{phone_no} } 
sub occupation { 
    $_[0]->{occupation}=$_[1] if defined $_[1]; $_[0]->{occupation} 
} 
# Class accessor methods 
sub headcount { scalar @Everyone } 
sub everyone { @Everyone} 
1; 

,我致電這樣

#!/usr/bin/perl 
# classatr2.plx 
use warnings; 
use strict; 
use Person; 
print "In the beginning: ", Person->headcount, "\n"; 
my $object = Person->new (
    surname=> "Galilei", 
    forename=> "Galileo", 
    address=> "9.81 Pisa Apts.", 
    occupation => "Philosopher" 
); 
print "Population now: ", Person->headcount, "\n"; 
my $object2 = Person->new (
    surname=> "Einstein", 
    forename=> "Albert", 
address=> "9E16, Relativity Drive", 
occupation => "Theoretical Physicist" 
); 
print "Population now: ", Person->headcount, "\n"; 
print "\nPeople we know:\n"; 
for my $person(Person->everyone) { 
    print $person->forename, " ", $person->surname, "\n"; 
} 

輸出繼電器

>perl classatr2.plx 
In the beginning: 0 
Population now: 1 
Population now: 2 
People we know: 
Galileo Galilei 
Albert Einstein 
> 

疑問 - >我有疑問在這部分代碼

for my $person(Person->everyone) { 
    print $person->forename, " ", $person->surname, "\n"; 
} 

查詢 - >這裏$ person是散列引用。爲什麼我們打電話像$person->forename。而散列引用應該被稱爲$person->{$forename}

+1

@TLP和mpapec在哪裏 – Nitesh

回答

8

$person不是一個散列引用;你早些時候有這條線bless($self, $class);。根據bless perldoc;

bless REF,CLASSNAME 
This function tells the thingy referenced by REF that it is now an object 
in the CLASSNAME package. 
+1

我想對此+1,但我覺得像一個幸運的hashref仍然是一個hashref。我的意思是,例如,'bless({foo =>'bar'}) - > {'foo'}'仍然是'bar'。如果你把「不是一個哈希引用」改爲「不只是一個哈希引用」,我肯定會贊成。 – ruakh

+0

U是對的。它造成了另一種懷疑。假設我們有一個像上面聲明的一樣的構造函數(new)。我們有一個方法說'getSurname'。在這一點上,我們正在做'$ self - > {surname}'。那麼它是如何工作的 – Nitesh

+0

因爲'$ self'是同一個'bless'(ed)散列引用的本地名稱。 –

3

關於在評論埃利奧特·弗裏施的回答表達了OP的疑惑,$person->{surname}$person->surname之間的區別是:

$person->{surname}直接訪問對象的內部數據。這違反了封裝,許多人認爲這是一個糟糕的做法。

$person->surname運行$person對象sub surname並返回結果。在這種情況下,sub所做的唯一的事情是返回$person->{surname}的值,但它可以做其他事情。舉例來說,如果你的Person類包括人的父母,然後$person->surname將能夠首先檢查的人是否有定義的姓,如果沒有,返回$person->father->surname(或者,在一些社會,$person->father->forename . 'sson'),而不是undef