youbo1 发表于 2015-12-26 08:17:31

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
在subroutine中,我们可以使用如下的方法来dereference array的reference:@{ $array_ref };
取得第一个元素如下:$ { $array_ref };
或者可以使用perl的特殊符号来使用array的reference,如下:
# Get all the elements of @numbers array.
@ { $_ }
# Get a particular element. This gives the first element of the array.
$ { $_ }
注意,如果只是dereference一个简单的scalar变量,可以忽略括号,如下:
@$array_ref# same as @{ $array_ref }
$$array_ref# same as $ { $array_ref }
$_         # not a simple scalar variable and this cant be dereferenced,

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

完!
  
页: [1]
查看完整版本: perl的引用和->