perl的引用和->

 
常见数据类型的引用定义:
数据类型           定义      举例
标量变量           \$Var                              $Pointer  =  \$Var
数组                 \@Array                          $Pointer  =  \@Array
哈希变量           \%Hash                           $Pointer  =  \%Hash
文件句柄           \*FILEHANDLE                $Pointer  =  \
常量                 \常量                               $Pointer  =  \3.1415926
子程序              \&SubRoutine                  $Pointer  =  \&SubRoutine
匿名数组            [ LIST ]                            $Pointer  =  [ “Smith”,“Jack”,“Jimmy”,“ZhaZha”]
匿名哈希变量     { Key=>Value }                $Pointer  = { Key1=>Value1,Key2=>Value2}
匿名子程序        sub {}                               $Pointer  =  sub { printf( “Hello,Perl World\n”);}
对象引用           bless  $self;
 
 
翻译自:
http://www.thegeekstuff.com/2010/06/perl-array-reference-examples/
http://www.thegeekstuff.com/2010/06/perl-hash-reference/
 
 
reference是另一个变量的地址。reference可以指向array,hash,或perl代码段。reference使perl代码运行更快。
 
一 array的reference和dereference
 
1)array的reference
正常地,我们存储list的元素在array中如下:@array =  (“one”,”two”,”three”,”four”,”five”);
使用\来将array的地址赋给reference变量,如下:$array_ref = \@array;
如果你print $array_ref,将显示如下:ARRAY(0x1a2b3c);
 
array的reference可以被传递给subroutine,如下:
sub add_numbers
{
  my $array_ref =  shift;
  .....
}  
@numbers = (11,2,3,45);
$array_ref = add_numbers(\@numbers);
在以上的代码中,我们需要对array的reference进行dereference,然后才可以使用array中的元素。
 
下面是传递array的reference到subroutine的优点:
* 如果array传递给subroutine,perl将整个array重新copy到@_中,当array比较大时,这将非常的低效。
* 当我们需要在subroutine中修改原来的array的时候,我们需要传递array的reference。
* reference其实是构造复杂数据结构的本质。
 
我们也可以将匿名的array赋给reference如下:$array_ref = [ 11,2,3,45]
 
2)array的reference的dereference
$ { VAR } [ $y] 等价于 VAR->[$y].
 
array ref的dereference: @{ $array_ref };
获得array ref里的第一个元素: $ { $array_ref }[0]
 
多wei数组:
@PKT = ( \@IP, \@PORT, \@LAYER ); #Storing the reference of @PKT array into the scalar variable.
$array_ref = \@PKT;
$ { $array_ref } [2] is same as $array_ref->[2]
$ { $ { $array_ref } [2] } [2] is same as $array_ref->[2]->[2]
$ { $ { $ { $array_ref } [2] } [2] } [1] is same as $array_ref->[2]->[2]->[1]
 
等价于: $array_ref->[2][2][1] 
 
 
二 hash的reference和dereference
hash的reference和dereference与array的一样。
 
hash的reference如下:
%author = (
'name'              => "Harsha",
'designation'      => "Manager"
);
 
$hash_ref = \%author;
 
dereference后访问元素如下:
$name = $ { $hash_ref} { name }; 等价于 my $name =  $hash_ref->{name};
 
访问所有的keys如下:
my @keys = keys % { $hash_ref }; 等价于my @keys = keys %author;
 
如果是简单scalar变量,可以忽略括号,如下:my @keys =  keys  %$hash_ref; $name = $$hash_ref{name};
 
匿名hash的reference如下:
my $hash_ref  =  {
'name'               => "Harsha",
'designation'       => "Manager"
};
 
使用如下:$name = $ { $hash_ref} { name };
 
三 对reference变量使用-> 来获得属性
my $name =  $hash_ref->{name};

posted @ 2011-04-21 13:58  iTech  阅读(4052)  评论(0编辑  收藏  举报