Perl 需要了解一些关于课堂的事情

Perl 需要了解一些关于课堂的事情,perl,Perl,假设我正在上课 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; } #

假设我正在上课

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";
}

Query->here$person是一个散列引用。为什么我们打电话像
$person->forename
。而hash ref应该被称为
$person->{$forename}
$person
不仅仅是一个hash引用;你有一行代码:
bless($self,$class)更早。根据perldoc


$person
不仅仅是散列引用;你有一行代码:
bless($self,$class)更早。根据perldoc


关于OP在对Elliott Frisch回答的评论中表达的疑问,
$person->{la姓氏}
$person->la姓氏
之间的区别是:

$person->{姓氏}
直接访问对象的内部数据。这违反了封装,许多人认为这是一个不良的做法。
$person->name
$person
对象上运行
子姓氏
,并返回结果。在这种特殊情况下,
sub
唯一要做的就是返回
$person->{lasname}
的值,但它可以做其他事情。例如,如果您的
Person
类包含此人的父母,则
$Person->Nastname
将能够首先检查此人是否定义了姓氏,如果没有,则返回
$Person->father->Nastname
(或者在某些社会中,
$Person->father->forename.“sson”
)关于OP在对Elliott Frisch回答的评论中表达的疑问,
undef

$person->{la姓氏}
$person->la姓氏
之间的区别是:

$person->{姓氏}
直接访问对象的内部数据。这违反了封装,许多人认为这是一个不良的做法。
$person->name
$person
对象上运行
子姓氏
,并返回结果。在这种特殊情况下,
sub
唯一要做的就是返回
$person->{lasname}
的值,但它可以做其他事情。例如,如果您的
Person
类包含此人的父母,则
$Person->Nastname
将能够首先检查此人是否定义了姓氏,如果没有,则返回
$Person->father->Nastname
(或者在某些社会中,
$Person->father->forename.“sson”
)我想+1这个,而不是
undef

,但是我觉得一个受祝福的hashref仍然是一个hashref。我的意思是,例如,
bless({foo=>'bar'})->{foo'}
仍然是
bar
。如果你把“非散列引用”改为“非散列引用”,我肯定会投赞成票。你是对的。这引起了彼此的怀疑。假设我们有一个与上面声明的相同的构造函数(new)。我们有一个方法,比如说
getname
。在这一点上,我们做的就像
$self->{姓氏}
。那么它是如何工作的,因为
$self
是同一个
bless
(ed)散列引用的本地名称。@nuakh Freudian fingers.@Nitesh,re“我们是如何使用
$person->姓氏检索的”<代码>$person->Nastname
正在调用代码中的对象访问器(
sub forename
)。我想+1这个,但我觉得受祝福的hashref仍然是hashref。我的意思是,例如,
bless({foo=>'bar'})->{foo'}
仍然是
bar
。如果你把“非散列引用”改为“非散列引用”,我肯定会投赞成票。你是对的。这引起了彼此的怀疑。假设我们有一个与上面声明的相同的构造函数(new)。我们有一个方法,比如说
getname
。在这一点上,我们做的就像
$self->{姓氏}
。那么它是如何工作的,因为
$self
是同一个
bless
(ed)散列引用的本地名称。@nuakh Freudian fingers.@Nitesh,re“我们是如何使用
$person->姓氏检索的”
$person->Nastname
正在您的代码中调用该对象访问器(
子名字
)。其中@TLP和mpapec在哪里?其中@TLP和mpapec在哪里
bless REF,CLASSNAME
This function tells the thingy referenced by REF that it is now an object 
in the CLASSNAME package.