2011-11-23 96 views
0

tutorial中,有一个Person类的代码。你能向我解释第21/27行的目的吗?我理解像$ _和@_这样的概念,并且我知道my用于声明本地引用,但我不了解这些代码上下文中的那些行。在Perl函数中声明变量

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

如果您有兴趣做OO Perl中,我会强烈建议考虑看看[穆斯(https://metacpan.org/module/Moose),这使得很多是重复的样板消失。有一个很好的介绍驼鹿在(免费)的书[现代的Perl](http://onyxneon.com/books/modern_perl/) – friedo

+0

[perlootut](http://search.cpan.org/perldoc?perlootut)是官方文档中的现代Perl OO教程。 – daxim

回答

3
20 sub setFirstName { 
21 my ($self, $firstName) = @_; 

在最基本的层面上,这条线取前两个参数的子程序,并将它们分配给本地变量$self$firstName

$person->setFirstName('jeeves'); 

在面向对象的Perl中,传递给该方法(因为这是在子程序已经成为)的第一个参数的情况下是在其上调用该方法的实例的引用($person是上述例)。您需要该参考来获取其他方法和实例状态。通常将其称为$self。在其他语言中,会有类似this的内置语言,因此您不必手动提取它。

之后,第一个特殊参数是该方法的其他(“正常”)参数。

1

这是一个标准的setter,它为person对象设置_firstName变量。现在,通过行会行

my ($self, $firstName) = @_; 

这是分配前两个参数与该setFirstName被调用$自我和$的firstName分别是相同

$self = $_[0]; $firstName = $_[1]; 

下一页

$self->{_firstName} = $firstName if defined($firstName); 

这是将$ self person对象的_firstName变量赋值给前一行定义的$ firstName,并且仅在定义了$ firstName时才这样做

$self->{_firstName} = $firstName if defined($firstName); 

返回自对象的新_FirstName,也未必可以改变

1

由于您了解@_的概念,您会意识到只要您需要它们,您就可以使用shift$_[0]访问这些概念。拥有这些产品线的原因更多的是最佳做法。由于Perl没有形式参数,我们通常在做任何事情之前将它们分配给子例程开始处的命名变量。通过这种方式,代码清楚地显示了子例程的期望以及每个参数的含义。 (之所以选择不这样做,是因为代码效率,但通常您应该首先选择代码清晰度。)

请注意变量周围的括号。这是将@_数组分配给包含($self, $firstname)的列表。如果你没有括号,它不会工作,因为它试图将一个数组分配给多个标量。请注意,如果@_包含更多参数,它们将被忽略。

该列表声明使用my。这意味着这些标量将只存在于这个子程序中。这是为了安全起见,如果您在其他地方使用同名的标量,则不会发生意外结果的冲突。请注意,您需要有use strict线在你的文件的顶部my予以强制执行。

$self用于面向对象的Perl。它将始终是方法的第一个参数。因此,在像$obj->firstname($foo)通话,$obj将被分配到$self你的方法里面,$foo将被分配到$firstname