在这个tutorial中,有一个Person类的代码。你能告诉我第21/27行的目的吗?我理解像$ _和@_这样的概念,我知道my
用于声明本地引用,但我不理解这段代码中的那些行。
1 #!/usr/bin/perl
2
3 package Person;
4
5 sub new
6 {
7 my $class = shift;
8 my $self = {
9 _firstName => shift,
10 _lastName => shift,
11 _ssn => shift,
12 };
13 # Print all the values just for clarification.
14 print "First Name is $self->{_firstName}\n";
15 print "Last Name is $self->{_lastName}\n";
16 print "SSN is $self->{_ssn}\n";
17 bless $self, $class;
18 return $self;
19 }
20 sub setFirstName {
21 my ( $self, $firstName ) = @_;
22 $self->{_firstName} = $firstName if defined($firstName);
23 return $self->{_firstName};
24 }
25
26 sub getFirstName {
27 my( $self ) = @_;
28 return $self->{_firstName};
29 }
30 1;
答案 0 :(得分:3)
20 sub setFirstName {
21 my ( $self, $firstName ) = @_;
在最基本的层面上,该行获取子例程的前两个参数,并将它们分配给局部变量$self
和$firstName
。
$person->setFirstName('jeeves');
在面向对象的Perl的上下文中,传递给方法的第一个参数(因为这是子例程已经变成的)是对调用该方法的实例的引用($person
就是上面的例)。您需要该引用以获取其他方法和实例状态。习惯上称之为$self
。在其他语言中,语言中会内置this
,因此您无需手动提取它。
之后,第一个特殊参数是方法的其他(“正常”)参数。
答案 1 :(得分:1)
这是一个标准的setter,它为person对象设置_firstName变量。现在一行一行
my ( $self, $firstName ) = @_;
这将分别调用setFirstName的前两个参数分配给$ self和$ firstName,它与
相同 $self = $_[0]; $firstName = $_[1];
下一步
$self->{_firstName} = $firstName if defined($firstName);
这是将$ self person对象的_firstName变量赋值给$ firstName,该$ firstName是在前一行中定义的,只有在定义$ firstName时才这样做
$self->{_firstName} = $firstName if defined($firstName);
返回self对象的新_firstName,它可能不一定会被更改
答案 2 :(得分:1)
由于您了解@_
的概念,您会意识到您可以根据需要使用shift
或$_[0]
来访问这些内容。拥有这些线条的原因更多是最佳做法。由于Perl没有形式参数,我们通常在执行任何其他操作之前将它们分配给子例程开头的命名变量。通过这种方式,代码清楚地显示了子例程所期望的内容以及每个参数的内容。 (您可能选择不执行此操作的原因是代码效率,但通常您应首先选择代码清晰度。)
注意变量周围的括号。这是将@_
数组分配给包含($self, $firstname)
的列表。如果您没有括号,它将无法工作,因为它正在尝试将数组分配给多个标量。请注意,如果@_
包含更多参数,则会忽略它们。
使用my
声明列表。这意味着这些标量只存在于此子例程中。这是为了安全,因此,如果您在其他地方使用具有相同名称的标量,则不会与意外结果发生冲突。请注意,您需要在文件顶部放置一行use strict
来强制执行my
。
$self
用于面向对象的Perl。它始终是方法的第一个参数。因此,在$obj->firstname($foo)
之类的通话中,$obj
将被分配到您方法中的$self
,而$foo
将被分配给$firstname
。